automake:编译器选项的顺序阻碍了 make
Posted
技术标签:
【中文标题】automake:编译器选项的顺序阻碍了 make【英文标题】:automake: the ordering of compiler options hinders make 【发布时间】:2013-09-16 19:54:06 【问题描述】:我是 automake 工具的新手。在“src/Makefile.am”中,我使用“AM_LDFLAGS = -L... -l...”。
然后,我运行“autoreconf --force --install ; ./configure ; make”
在最后一条命令中,
$ g++ -O2 -L... -l... -o target_name [some *.o files]
编译器报错“未定义的引用...”。
但是如果我复制它并将“-L...-l...”移动到最后,并独立运行它就可以了(如下)。
$ g++ -O2 -o target_name [some *.o files] -L... -l...
所以选项的顺序很重要吗?无论如何,如何平滑它?
非常感谢。
【问题讨论】:
【参考方案1】:对于“-L”选项,请尝试使用 LDADD 或 target_name_LDADD 变量(其中 target_name 替换为实际目标名称)。这会将这些标志放在链接命令的末尾。
“-l”和“-L”的顺序确实有所不同。来自http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html:
-l 库 链接时搜索名为 library 的库。 ...在您编写此选项的命令中的位置有所不同;链接器按照指定的顺序搜索和处理库和目标文件。因此,“foo.o -lz bar.o”在文件 foo.o 之后但在 bar.o 之前搜索库“z”。如果 bar.o 引用了“z”中的函数,则可能不会加载这些函数。 ...链接器通过扫描存档文件来处理存档文件,其中包含定义迄今为止已被引用但尚未定义的符号的成员。
所以库应该出现在目标文件/其他依赖它们的库之后。
【讨论】:
以上是关于automake:编译器选项的顺序阻碍了 make的主要内容,如果未能解决你的问题,请参考以下文章
Linux下automake工具使用(自动构建Makefile文件)