【问题标题】:g++ 5.5 not linking shared library [closed]g ++ 5.5未链接共享库[关闭]
【发布时间】:2019-03-21 15:26:11
【问题描述】:

我正在尝试将一个简单的程序 code.cpp 从我的个人计算机(运行最新的 Arch Linux 安装)上的两个共享库 libA.solibB.so 移植到一台装有 Ubuntu 16.04 的机器上LTS。编译库工作得很好,但是在编译 code.cpp 时我得到了很多 undefined reference 错误。

我怀疑这是因为libA.solibB.so 相关联,而libA.solibB.so 在Ubuntu 16.04 上编译正常,奇怪的是libA.so 没有与@987654332 相关联@,尽管编译标志 -lB,这反过来会在生成二进制文件时导致未定义的引用。另一方面,在 Arch Linux 上,libA.so 确实与libB.so 链接,或者ldd 告诉我。

我最初虽然问题可能是 GCC 版本不匹配,但即使在 Ubuntu 16.04 上安装和使用 GCC 8 后,问题仍然存在。

【问题讨论】:

标签: c++ linker g++ shared-libraries


【解决方案1】:
  1. 没有人保证不仅在不同 Linux 发行版之间,甚至在同一 Linux 发行版的不同版本之间完全兼容。曾尝试将其统一称为 LSB,但不幸的是它失败了。
  2. 不同的 C++ 编译器通常具有不兼容的 C++ 库。这也是一个很大的痛苦。
  3. 我强烈建议您在目标平台上重新编译所有内容。
  4. 关于加载共享库存在歧义。对于某些系统,如果您链​​接与库 B 链接的库 A,则库 B 的符号可用于您的程序。对于某些系统,情况并非如此。

【讨论】:

  • 感谢您的意见。但是关于2)我尝试使用相同的编译器(GCC v8)但没有成功; 3)我正在重新编译目标机器上的所有内容,问题是生成的共享对象显示不同的链接; 4)奇怪的是,如果我直接从我的原始平台复制libA.so(正确链接到libB.so),那么一切正常。
  • 一般你不能依赖它。尤其是使用 C++ 代码。你的朋友有 2 个程序:ldd 和 nm。检查缺少的内容。
猜你喜欢
  • 2014-04-29
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 2011-04-02
相关资源
最近更新 更多