【发布时间】:2014-04-18 13:04:31
【问题描述】:
我正在尝试将多个动态库链接到一个应用程序中,但遇到了 g++ 问题。
考虑:
- libA.so
- libB.so 依赖于 libA.so
- libC.so 依赖于 libB.so
- 应用程序 D 直接依赖于 libC.so
如果我尝试将应用程序 D 仅链接到 libC.so,我会得到 A 和 B 中符号的未解析符号。我觉得编译器应该能够弄清楚,当我使用 intel 编译器时,确实如此。然而,G++ 无法找出链接。我希望我的库和可执行文件只需要链接到他们直接需要的东西,而不是试图预测他们使用的库需要什么。
当 libA.so 链接到静态库时,我也遇到了问题,当我尝试编译可执行文件时,我从 libA.so 应该使用的静态库中得到未解析的符号。
我看到很多其他人问过这个问题和类似问题并得到了各种各样的答案 (Linking with dynamic library with dependencies),但答案都相当模糊,经常相互矛盾,而且非常类似于“继续卡车运输”和 RTFM”。
我觉得链接顺序很重要。怎么会,我怎么知道链接的顺序?
更新
我相信正在发生的事情类似于 libA.so 包含两个函数(AA 和 AB)。 libB.so 需要 AA,libC.so 需要 AB。当 libB.so 被链接时,g++ 得到 libA.so,看到只使用了 AA,并删除了 AB。然后当 libC.so 被链接进来时,g++ 看到 libA.so 已经被链接并且不会重新访问它,导致 AB 未定义。我已经看到文档表明静态库以这种方式工作,但是编译器会以同样的方式处理动态库吗?如果是这样,有没有办法解决它?
【问题讨论】:
-
如果 libC 直接从 libA 引用一个符号,那么 libC 可能应该直接链接到 libA。
-
“但是,G++ 无法识别链接。”您的意思是链接器,而不是 G++
-
"g++得到libA.so,看到只用了AA,就丢掉AB" 再次,G++和它无关,链接器做,但是没有,它不适用于动态库
-
您使用的是什么版本的 binutils?你得到的错误到底是什么?有没有提到
-rpath-link? -
我的链接器错误类似于“libX.so: undefined reference/symbol fooBar”,其中“fooBar”来自 libX.so 链接到的库之一。这是标准的“您没有使用您正在使用的功能链接到库”链接错误。 libX.so 链接正确,ldd 显示它引用了所需的库,但我从 libX.so 构建的可执行文件会生成链接错误。是的,可执行文件直接链接到它使用的所有内容。问题是当可执行文件链接到 B 和 B 使用 A,但可执行文件不使用 A 所以不直接链接到它。
标签: c++ g++ dynamic-linking