【问题标题】:Keep gcc linker from using non-system libraries found in system /lib64 folder防止 gcc 链接器使用系统 /lib64 文件夹中的非系统库
【发布时间】:2018-07-06 06:30:33
【问题描述】:

我正在将一个大型 C++ 库 (libcoro.so) 和示例应用程序 (coro-example.cpp) 从 Windows 移植到 RedHat Linux 7.4。我在 Linux 上的开发经验很少,所以这可能是一个“新手”问题。我有 libcoro 和示例应用程序在我的 RHEL 7.4 VM 上编译、链接和运行。但是,当他尝试将 coro-example.o 链接到 libcoro.so 时,gcc 链接器无法链接客户的 RHEL 7.4 计算机上的应用程序。错误信息是:

/usr/bin/ld:警告:libusb-0.1.so.4,./bin/libcoro.so 不需要 找到(尝试使用 -rpath 或 -rpath-link)
libcoro.so: undefined 引用“usb_open”
libcoro.so:未定义的引用 'usb_release_interface'
...等...

在我的机器上运行 'ldd coro.so' 显示:

libusb-0.1.so.4 => /lib64/libusb-0.1.so.4 (0x00007f71115db000)
...等等...

在客户的机器上:

libusb-0.1.so.4 => 未找到
[许多其他库] => 未找到
...etc...

确实,这些库在我的 /lib64 文件夹中,但不在客户的文件夹中。我不确定它们是如何安装在我的机器上的。我可以访问缺少的库,并且可以使用我的 libcoro.so 库来交付它们。我真的希望我的应用程序是独立的并且可以在任何 RHEL 7.x 机器上运行。我的问题是:

如果我不提供本地副本,那么确定哪些库不属于 RHEL 7.x 安装并且链接器在我的机器上失败的最佳方法是什么?我尝试使用 -nodefaultlibs 进行链接,但在 printf() 等函数上链接失败,而且我还没有找到找到这些标准库的方法。它们似乎不在 /lib64 中。

有没有办法从默认库搜索中排除 /lib64?

【问题讨论】:

  • "...这些库在我的 /lib64 文件夹中..." - Red Hat 和 Fedora 在 64 位机器上使用 lib64/(但不是 32-位机)。 Debian 和 Ubuntu 使用更传统的方案,其中库位于 lib/。另请参阅您的/usr/share/config.site,它由pkg-config 使用。另请参阅 Stack Overflow 上的 config.site for vendor libs on Fedora x86_64
  • @jww 我的 RHEL 7.4 VM 没有 /usr/share/config.site。我还能在哪里寻找它?
  • 试试find /usr -name config.site。我无法使用 Red Hat 机器,所以我在 Fedora 和 CentOS 上进行测试。

标签: linux gcc linker


【解决方案1】:

有一个链接器开关-Wl,--no-undefined 似乎可以满足我的要求。它无法链接并生成错误,因为该库未明确命名。此外,命令ldd libcoro.so 列出了所有依赖项以及它们被解析的位置。我还发现这个this article 很有帮助。

【讨论】:

    猜你喜欢
    • 2015-01-14
    • 2013-02-17
    • 2014-08-31
    • 2022-08-24
    • 1970-01-01
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    相关资源
    最近更新 更多