我正在尝试使用GNU autotools和MinGW交叉编译项目。
该项目使用需要-lws2_32
标志的winsock2 API,并且在正常使用情况下(使用CFLAGS或AM_LDFLAGS),该标志无论如何将无法正常工作,并且我始终会收到以下错误消息:
undefined reference to `__imp_WSACleanup'
# and a lot of other undefined references which belongs to winsock2
经过一些研究,我found必须将标志-lws2_32
放在编译器命令的末尾,否则它将不起作用。
[手动确认运行编译器命令并在末尾带有-lws2_32
标志,我确认这将对我有用,因此TRUE问题逼近:
将参数附加到GNU Build System(autotools)中的libtool生成的编译器命令行末尾的正确方法是什么?
我为此进行了一些研究,但是我发现的唯一方法是入侵libtool,看来这不是正确的方法。
该项目使用需要-lws2_32标志的winsock2 API,并且在正常使用情况下(使用CFLAGS或AM_LDFLAGS),该标志将不起作用
在*_LDFLAGS
中放入库名是not正常甚至正确的用法,很大程度上是因为您恰恰描述了这个问题。链接命令对参数的顺序敏感,通常,需要将引用它们的对象文件命名为after。 LDFLAGS
变量系列在每个链接命令行的开头,在目标的目标文件之前展开。
将参数附加到GNU Build System(autotools)中的libtool生成的编译器命令行末尾的正确方法是什么?
有几种解决方法。最常规的方法是在AC_CHECK_LIB
中使用AC_SEARCH_LIBS
或configure.ac
。例如,
# configure.ac ...
AC_SEARCH_LIBS([WSACleanup], [ws2_32], [], [AC_MSG_ERROR([Could not find required library libws2_32])])
# ...
[默认情况下,当这些文件成功找到库时,它们会在LIBS
输出变量之前附加适当的库标志,该输出变量的内容在每个链接命令行中都会扩展。因此,此方法不需要您的Makefile.am
提供任何相应的支持。
其他主要替代方法是LDADD
变量家族(用于链接程序目标)和LIBADD
变量家族(用于链接库目标)。 LDADD
和LIBADD
本身分别适用于在同一Makefile.am
中定义的所有程序和所有库,或者您可以为它们加上目标名称以为单个目标指定库(例如foo_LIBADD
) 。例如,
# Makefile.am ...
bin_PROGRAMS = myprog
# ...
myprog_LDADD = -lws2_32
# ...
有关详细信息,请咨询the Automake manual。>>