【问题标题】:Why would I need to list -ldl before a library that calls dlopen/dlclose/dlerror when linking为什么我需要在链接时调用 dlopen/dlclose/dlerror 的库之前列出 -ldl
【发布时间】: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
...它可以正常工作。

这与我认为我在链接时知道的关于命令行中库顺序的一切相反。

  1. 为什么-ldl 必须在-lyydesign 之前?
  2. 除了偶然发现此解决方案的运气外,我如何解决原始错误以了解发生了什么?
  3. 而且由于将构建系统更改为在所有需要的地方首先移动 -ldl 有点痛苦,有什么方法可以避免将 -ldl 放在第一位吗?

【问题讨论】:

  • 如果不想更正依赖顺序,请使用--start-group [ libs ] --end-group
  • 在链接时,通常情况下,被依赖者应该出现在被依赖者之前吗?我一直听说它应该是依赖者,然后是依赖者(例如,here。)
  • 这看起来不可能在这个宇宙中发生。
  • 这是可重复的——第一种形式的错误和第二种形式的成功。有什么建议可以进一步追踪发生的事情吗?
  • 我怀疑 RHEL 和 gcc 6(以及 redhat 可能完成的任何兼容性 shims)是这个难题的重要组成部分。这不是 gcc 4 的问题。我需要制作一个简化的测试用例来测试其他操作系统/版本。

标签: c++ linker g++ rhel


【解决方案1】:

LD 的库顺序很重要。 lib yydesign 使用 dlclosedlerror 这就是为什么 lib dl 需要在 yydesign 之前传递。

【讨论】:

  • 你完全搞错了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 2020-06-15
  • 1970-01-01
  • 2021-07-23
  • 2012-02-06
  • 1970-01-01
相关资源
最近更新 更多