GCC:将外部共享对象静态添加到编译中

GCC: Statically adding an external shared-object to the compilation

我有 2 个 C 库:

  1. 依赖库,编译为共享对象
  2. 我的图书馆 - 我也想将其编译为共享对象

我想将我的库编译成共享对象,但我希望在运行时加载依赖库。

即我希望依赖库成为我从我的库创建的共享对象的一部分,因此在使用我的库时不必将依赖项添加到 LD_LIBRARY_PATH。

我如何使用 GCC 来实现?

这似乎是一个 XY 问题:您想静态添加一个 SO 以避免使用 LD_LIBRARY_PATH。请允许我谈谈后者而忽略前者。 ;-)

LD_LIBRARY_PATH 是一种临时覆盖 库搜索路径的方法。注意"overwrite":LD_LIBRARY_PATH给出的路径先搜索,如果在其中找到库,则标准搜索路径 为该图书馆考虑过。它 "knocks out" 可能安装在标准路径中的其他版本。很容易看出这会如何产生令人惊讶和不需要的后果。它主要是 调试 功能,因此您不想使用它是对的。

有三种 "correct" 方法可以解决此问题:

1) 在其中一个标准搜索路径中安装 依赖项(/usr/lib/* / /lib/*,检查 /etc/ld.so.conf 以获得列表) .这将需要超级用户权限。

2) 添加标准搜索路径的依赖路径(在/etc/ld.so.conf中)。这将需要超级用户权限。

3) 在编译时配置 依赖项到您的库的路径 (-Wl,-rpath=/path/to/lib/)。这会将给定路径添加到 此库仅 搜索的路径中。它不需要任何特殊权限,并且具有 LD_LIBRARY_PATH 所具有的 none 个缺点。

顺便说一句,您可以通过 ldd <filename>.

检查您的二进制文件在哪里 "find" 它的库