我有2个C库:
我想将我的库编译成共享对象,但我不希望在运行时加载依赖库。
即。我希望依赖库成为我从库中创建的共享对象的一部分,因此在使用我的库时,不必将依赖项添加到LD_LIBRARY_PATH。
如何使用GCC进行此操作?
答案 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>
检查二进制文件“找到”其库的位置。