保持gcc链接器不使用system / lib64文件夹

时间:2018-01-26 21:01:19

标签: linux gcc linker

我正在将一个大型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 =>未找到
[许多其他libs] =>没找到...等... ...

实际上,这些库位于我的/ lib64文件夹中,但不属于客户。我不确定它们是如何安装在我的机器上的。我可以访问缺少的库,并可以使用我的libcoro.so库提供它们。我真的希望我的应用程序是自包含的,并在任何RHEL 7.x计算机上运行。我的问题是:

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

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

1 个答案:

答案 0 :(得分:1)

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