gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:29:51 25 4
gpt4 key购买 nike

我正在尝试编译示例 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 之后出现在命令行上的一个或多个库指的是在其中一个库中定义的符号。但是链接器已经完成扫描 libffilibdl 并且不会重新扫描它们以查找这些符号。通过在列表末尾重新列出库的名称,强制链接器再次扫描这些库,可以解决这种循环依赖。

更具可扩展性的解决方案是使用 --start-group archives --end-group 选项来列出要链接到的库。引用自 man page :

-( archives -)
--start-group archives --end-group The archives should be a list of archive files. They may be either explicit file names, or -l options.

The specified archives are searched repeatedly until no new undefined references are created. Normally, an archive is searched only once in the order that it is specified on the command line. If a symbol in that archive is needed to resolve an undefined symbol referred to by an object in an archive that appears later on the command line, the linker would not be able to resolve that reference. By grouping the archives, they all be searched repeatedly until all possible references are resolved.

Using this option has a significant performance cost. It is best to use it only when there are unavoidable circular references between two or more archives.

所以你的命令行看起来像这样:

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

关于c++ - 为什么我必须为 LLVM 链接这些库两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17100703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com