0

我是自动制作工具的新手。在“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...

那么选项的顺序很重要吗?无论如何,如何平滑它?

非常感谢。

4

1 回答 1

1

对于“-L”选项,尝试使用 LDADD 或 target_name_LDADD 变量(其中 target_name 被实际目标名称替换)。这会将这些标志放在链接命令的末尾。

“-l”和“-L”的顺序确实有所不同。从http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

-l library 链接时搜索名为 library 的库。...在您编写此选项的命令中的位置有所不同;链接器按照指定的顺序搜索和处理库和目标文件。因此,“foo.o -lz bar.o”在文件 foo.o 之后但在 bar.o 之前搜索库“z”。如果 bar.o 引用 'z' 中的函数,则可能不会加载这些函数。...链接器通过扫描存档文件来处理存档文件,以查找定义迄今为止已被引用但尚未定义的符号的成员。

所以库应该出现在依赖它们的目标文件/其他库之后。

于 2013-09-16T21:50:33.240 回答