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

问题描述 投票:0回答:1

我正在尝试使用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,看来这不是正确的方法。

autotools automake libtool
1个回答
0
投票

该项目使用需要-lws2_32标志的winsock2 API,并且在正常使用情况下(使用CFLAGS或AM_LDFLAGS),该标志将不起作用

*_LDFLAGS中放入库名是not正常甚至正确的用法,很大程度上是因为您恰恰描述了这个问题。链接命令对参数的顺序敏感,通常,需要将引用它们的对象文件命名为afterLDFLAGS变量系列在每个链接命令行的开头,在目标的目标文件之前展开。

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

有几种解决方法。最常规的方法是在AC_CHECK_LIB中使用AC_SEARCH_LIBSconfigure.ac。例如,

# configure.ac ...

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

# ...

[默认情况下,当这些文件成功找到库时,它们会在LIBS输出变量之前附加适当的库标志,该输出变量的内容在每个链接命令行中都会扩展。因此,此方法不需要您的Makefile.am提供任何相应的支持。


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

# Makefile.am ...

bin_PROGRAMS = myprog

# ...

myprog_LDADD = -lws2_32

# ...

有关详细信息,请咨询the Automake manual。>>

© www.soinside.com 2019 - 2024. All rights reserved.