GCC:将外部共享对象静态添加到编译中
GCC: Statically adding an external shared-object to the compilation
我有 2 个 C 库:
- 依赖库,编译为共享对象
- 我的图书馆 - 我也想将其编译为共享对象
我想将我的库编译成共享对象,但我不希望在运行时加载依赖库。
即我希望依赖库成为我从我的库创建的共享对象的一部分,因此在使用我的库时不必将依赖项添加到 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" 它的库
我有 2 个 C 库:
- 依赖库,编译为共享对象
- 我的图书馆 - 我也想将其编译为共享对象
我想将我的库编译成共享对象,但我不希望在运行时加载依赖库。
即我希望依赖库成为我从我的库创建的共享对象的一部分,因此在使用我的库时不必将依赖项添加到 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>
.