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

时间:2015-02-11 11:27:20

标签: gcc linkage

我有2个C库:

  1. 编译为共享对象的依赖库
  2. 我的库 - 我也想将其编译为共享对象
  3. 我想将我的库编译成共享对象,但我希望在运行时加载依赖库。

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

    如何使用GCC进行此操作?

1 个答案:

答案 0 :(得分:2)

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

LD_LIBRARY_PATH临时覆盖库搜索路径的一种方法。注意“覆盖”:LD_LIBRARY_PATH中给出的路径首先在中搜索,如果在其中找到了库,则标准搜索路径为此考虑图书馆。它“淘汰”可能安装在标准路径中的其他版本。很容易看出这会产生多么令人惊讶和不必要的后果。它主要是 debug 功能,因此您不想使用它。

有三种“正确”方法可以解决这个问题:

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

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

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

另外,您可以通过ldd <filename>检查二进制文件“找到”其库的位置。