【发布时间】:2020-09-17 09:17:50
【问题描述】:
我正在使用 gcc 6.2 在 RHEL 上构建一个可执行文件(我们称之为 foo.exe)。它链接到一些第三方库 libzzdesign.so、libyydesign.so。 Yydesign 使用 dlopen/dlclose/dlerror。我希望这个命令行能够工作:g++ -Wall -fcheck-new -fno-strict-aliasing -msse2 -fno-omit-frame-pointer -pthread -O3 -Wl,--export-dynamic -o foo.exe foo.o -L/path/to/zzdesign -Wl,-rpath=/path/to/zzdesign -lzzdesign -L/path/to/yydesign -Wl,-rpath=/path/to/yydesign -lyydesign -ldl
(我列出了所有使用的选项以防万一)
它会产生错误,/path/to/yydesign/libyydesign.so: undefined reference to 'dlclose'/path/to/yydesign/libyydesign.so: undefined reference to 'dlerror'
如果我将命令行更改为将-ldl 之前 -lyydesign:g++ -Wall -fcheck-new -fno-strict-aliasing -msse2 -fno-omit-frame-pointer -pthread -O3 -Wl,--export-dynamic -o foo.exe foo.o -L/path/to/zzdesign -Wl,-rpath=/path/to/zzdesign -lzzdesign -L/path/to/yydesign -Wl,-rpath=/path/to/yydesign -ldl -lyydesign
...它可以正常工作。
这与我认为我在链接时知道的关于命令行中库顺序的一切相反。
- 为什么
-ldl必须在-lyydesign之前? - 除了偶然发现此解决方案的运气外,我如何解决原始错误以了解发生了什么?
- 而且由于将构建系统更改为在所有需要的地方首先移动 -ldl 有点痛苦,有什么方法可以避免将 -ldl 放在第一位吗?
【问题讨论】:
-
如果不想更正依赖顺序,请使用
--start-group [ libs ] --end-group。 -
在链接时,通常情况下,被依赖者应该出现在被依赖者之前吗?我一直听说它应该是依赖者,然后是依赖者(例如,here。)
-
这看起来不可能在这个宇宙中发生。
-
这是可重复的——第一种形式的错误和第二种形式的成功。有什么建议可以进一步追踪发生的事情吗?
-
我怀疑 RHEL 和 gcc 6(以及 redhat 可能完成的任何兼容性 shims)是这个难题的重要组成部分。这不是 gcc 4 的问题。我需要制作一个简化的测试用例来测试其他操作系统/版本。