如何在 GNU 构建系统中将参数附加到 libtool 生成的编译器命令行的末尾?

How to append arguments to the end of the libtool-generated compiler command line in GNU Build System?

我正在尝试使用 GNU autotools 和 MinGW 交叉编译一个项目。

这个项目使用 winsock2 API 需要 -lws2_32 标志,并且正常使用(使用 CFLAGS 或 AM_LDFLAGS),标志无论如何都不起作用,我总是得到以下错误消息:

undefined reference to `__imp_WSACleanup'

# and a lot of other undefined references which belongs to winsock2

经过一番研究,我found认为标志-lws2_32必须放在编译命令的末尾,否则将无法运行。

手动 运行 编译器命令最后带有 -lws2_32 标志,我确认这对我有用,因此,真正的问题接近:

将参数附加到由 GNU 构建系统 (autotools) 中的 libtool 生成的编译器命令行末尾的正确方法是什么?

我为此做了一些研究,但我发现的唯一方法是破解 libtool,这似乎不是正确的方法。

This project uses winsock2 API which needs the -lws2_32 flag, and with normal usage (using CFLAGS or AM_LDFLAGS), the flag will not work

将库名称放在 *_LDFLAGS 不是 正常甚至正确的用法,主要是因为您描述的问题. Link 命令对参数的顺序很敏感,通常,库需要在 引用它们的目标文件之后 命名。 LDFLAGS 变量族在每个 link 命令行的早期展开,在目标的目标文件之前。

What is the proper way to append arguments to the end of the compiler command line which is generated by libtool in GNU Build System (autotools)?

有几种方法可以解决这个问题。最常规的一种是在 configure.ac 中使用 AC_CHECK_LIBAC_SEARCH_LIBS。例如,

# configure.ac ...

AC_SEARCH_LIBS([WSACleanup], [ws2_32], [], [AC_MSG_ERROR([Could not find required library libws2_32])])

# ...

默认情况下,当它们成功找到库时,它们会将适当的库标志添加到 LIBS 输出变量,其内容在每个 link 命令行中展开。因此,此方法不需要您的 Makefile.am.

中的任何相应支持

其他主要替代方案是 LDADD 变量族(用于 linking 程序目标)和 LIBADD 变量族(用于 linking 库目标). LDADDLIBADD 本身分别适用于在同一个 Makefile.am 中定义的所有程序和所有库,或者您可以在它们前面加上目标名称以单独为该目标指定库(例如例如,foo_LIBADD)。例如,

# Makefile.am ...

bin_PROGRAMS = myprog

# ...

myprog_LDADD = -lws2_32

# ...

有关详细信息,请参阅 the Automake manual