我正在尝试编译示例LLVM程序。链接器步骤使用此命令。
llvm-config-3.2 --ldflags --libs
这导致以下命令。
g++ -o bin/Debug/test-llvm obj/Debug/main.o -L/usr/lib/llvm-3.2/lib -lpthread -lffi -ldl -lm (a boat load of LLVM libraries here)
然而,它无法链接。我得到这样的错误。
undefined reference to ffi_type_float
所以,我在最后添加了-lffi
和-ldl
。
g++ -o bin/Debug/test-llvm obj/Debug/main.o -L/usr/lib/llvm-3.2/lib -lpthread -lffi -ldl -lm (a boat load of LLVM libraries here) -lffi -ldl
所以,是的,他们在命令中显示TWICE ......但是它以这种方式工作。为什么?它们在论证的前面清楚地引用过。
答案 0 :(得分:4)
-lffi
和-ldl
之后出现在命令行上的一个或多个库引用其中一个库中定义的符号。但链接器已完成扫描libffi
和libdl
,并且不会为这些符号重新扫描它们。可以通过强制链接器通过在列表末尾重新列出它们的名称来再次扫描这些库来解决此循环依赖关系。
更具伸缩性的解决方案是使用--start-group archives --end-group
选项列出要链接的库。引自man page:
- (档案 - )
--start-group
档案--end-group
存档应该是存档文件列表。它们可以是显式文件名,也可以是-l选项。重复搜索指定的存档,直到没有创建新的未定义引用。通常,搜索存档 只按命令行中指定的顺序执行一次。如果一个 需要该存档中的符号来解析未定义的符号 由稍后出现的存档中的对象引用 命令行,链接器将无法解析该引用。 通过对档案进行分组,可以反复搜索所有档案 可能的参考文献已经解决。
使用此选项会产生显着的性能损失。最好只在不可避免的循环引用之间使用它 两个或多个档案。
所以你的命令行看起来像这样:
g++ -o bin/Debug/test-llvm obj/Debug/main.o -L/usr/lib/llvm-3.2/lib --start-group -lpthread -lffi -ldl -lm ... --end-group
答案 1 :(得分:2)
llvm-config-3.2 --libs
llvm-config-3.2 --ldflags
是的,从另一个问题来看,这在技术上得到了回答:Why does the order in which libraries are linked sometimes cause errors in GCC?
我仍然只是觉得这个问题很有意义,因为按照文档告诉我的做法让我陷入危险之中。 :(
答案 2 :(得分:1)
为什么我必须两次链接这些库
因为命令行matters上存档库的顺序和您的顺序错误。