Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我必须为LLVM链接这些库两次?_C++_Linker_Llvm - Fatal编程技术网

C++ 为什么我必须为LLVM链接这些库两次?

C++ 为什么我必须为LLVM链接这些库两次?,c++,linker,llvm,C++,Linker,Llvm,我正在尝试编译一个示例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 f

我正在尝试编译一个示例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

所以,是的,他们在命令中出现了两次。。。但它是这样工作的。为什么?它们在前面的参数中被清楚地引用。

命令行上出现在
-lffi
-ldl
之后的一个或多个库引用了其中一个库中定义的符号。但是链接器已经完成了对
libffi
libdl
的扫描,并且没有为这些符号重新扫描它们。通过在列表末尾重新列出这些库的名称,强制链接器再次扫描这些库,可以解决此循环依赖关系

更具可扩展性的解决方案是使用
--start group archives--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
为什么我必须链接这些库两次


因为命令行和您的存档库的顺序是错误的。

啊,我找到了解决方案。交换旗帜实际上并没有改变顺序。我不得不把它分成两个单独的电话

llvm-config-3.2 --libs
llvm-config-3.2 --ldflags
是的,另一个问题从技术上回答了这个问题:


我仍然认为这个问题是相关的,因为按照医生的指示行事会让我陷入危险之中(

duplicate of?可能的duplicate of不是duplicate;虽然另一个问题的答案恰好解决了这个问题,但它们仍然是不同的问题。也许我可以重新构造这个问题:
llvm config
为什么不管参数顺序如何,都以错误的顺序链接内容?我尝试交换
--ldflags
--libs
都没有用。我还有别的方法可以调整它们吗?到目前为止,我不知道除了把它们放进两次之外还能做什么。=/一旦你阅读并理解了链接的文档,你应该知道你还能做什么。--start/--end组是一根拐杖,不是真正的解决方案。这里它将“修复”问题是,但解决方案是错误的。正确的解决方案是正确地排序库。@EmployedRussian这肯定不是一个理想的解决方案,但考虑到要链接到多个具有循环依赖关系的库,手动排序就成了维护的噩梦,拐杖看起来非常有吸引力。