我如何以编程方式确定我的 C++ 运行时库在哪里?
How can I programatically determine where my C++ runtime libraries are?
我正在使用 "hax" 在 CentOS 6 上使用 GCC 4.8 构建 C++11,然后在任意 CentOS 6 目标上部署(任何与 C++ 相关的开箱即用的东西都将构建为 C ++03 与 GCC 4.3) () .
为了完成这项工作,我将发布我的所有第三方库以及 g++ 运行 次,以及 rpath
我的可执行文件,以便确保找到更新的库在适当的地方。对于 运行 次,根据我的计算,我需要运送 libstdc++
和 libgcc_s
。但我需要知道它们在我的构建系统中的位置,以便我可以将它们打包。
有什么巧妙的方法可以从我的打包脚本中查询它们的位置吗?
(如果最好的方法太笨拙,我会静态地 link 它们,但我想尽可能避免这种情况,因为我的项目包含多个可执行文件。另外,如果我要静态 link 一切 我相信我会 运行 对我的整个项目进行 GPL 的风险,例如通过静态 link MySQL C API via my C++ MySQL wrapper lib. 可以做两者的混合,我想,虽然 some sources warn against this…)
对于奖励积分,我是否需要在此列表中添加任何内容,超出 libssl
、libcrypto
、libm
、libpthread
、libc
, librt
, libz
和 ld-linux-x86-64
?
如果我没理解错的话,您已经构建了二进制文件,只是想获取运行时库列表以将它们与二进制文件一起打包吗?您可以尝试为此使用 ldd
,例如:
> ldd /usr/bin/ls
linux-vdso.so.1 (0x00007ffe76dd2000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fc97131f000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007fc97111a000)
libacl.so.1 => /lib64/libacl.so.1 (0x00007fc970f10000)
libc.so.6 => /lib64/libc.so.6 (0x00007fc970b68000)
libpcre.so.1 => /usr/lib64/libpcre.so.1 (0x00007fc970902000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fc9706fd000)
/lib64/ld-linux-x86-64.so.2 (0x000055c4ba4ed000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007fc9704f8000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc9702db000)
这样您将看到所有需要的库,当然,通过 dlopen() 使用的库除外。
在我的 Makefile 中:
GCC_INSTALL_DIR := $(shell $(CXX) -print-search-dirs | grep install | cut -d' ' -f2)
…然后我的主要构建目标将执行:
ln -sf $(GCC_INSTALL_DIR)/libstdc++.so $(BIN_DIR)/deps/
…我可以将 $(BIN_DIR)/deps
中的所有内容转储到安装时的正确位置。
我觉得。
我正在使用 "hax" 在 CentOS 6 上使用 GCC 4.8 构建 C++11,然后在任意 CentOS 6 目标上部署(任何与 C++ 相关的开箱即用的东西都将构建为 C ++03 与 GCC 4.3) (
为了完成这项工作,我将发布我的所有第三方库以及 g++ 运行 次,以及 rpath
我的可执行文件,以便确保找到更新的库在适当的地方。对于 运行 次,根据我的计算,我需要运送 libstdc++
和 libgcc_s
。但我需要知道它们在我的构建系统中的位置,以便我可以将它们打包。
有什么巧妙的方法可以从我的打包脚本中查询它们的位置吗?
(如果最好的方法太笨拙,我会静态地 link 它们,但我想尽可能避免这种情况,因为我的项目包含多个可执行文件。另外,如果我要静态 link 一切 我相信我会 运行 对我的整个项目进行 GPL 的风险,例如通过静态 link MySQL C API via my C++ MySQL wrapper lib. 可以做两者的混合,我想,虽然 some sources warn against this…)
对于奖励积分,我是否需要在此列表中添加任何内容,超出 libssl
、libcrypto
、libm
、libpthread
、libc
, librt
, libz
和 ld-linux-x86-64
?
如果我没理解错的话,您已经构建了二进制文件,只是想获取运行时库列表以将它们与二进制文件一起打包吗?您可以尝试为此使用 ldd
,例如:
> ldd /usr/bin/ls
linux-vdso.so.1 (0x00007ffe76dd2000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fc97131f000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007fc97111a000)
libacl.so.1 => /lib64/libacl.so.1 (0x00007fc970f10000)
libc.so.6 => /lib64/libc.so.6 (0x00007fc970b68000)
libpcre.so.1 => /usr/lib64/libpcre.so.1 (0x00007fc970902000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fc9706fd000)
/lib64/ld-linux-x86-64.so.2 (0x000055c4ba4ed000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007fc9704f8000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc9702db000)
这样您将看到所有需要的库,当然,通过 dlopen() 使用的库除外。
在我的 Makefile 中:
GCC_INSTALL_DIR := $(shell $(CXX) -print-search-dirs | grep install | cut -d' ' -f2)
…然后我的主要构建目标将执行:
ln -sf $(GCC_INSTALL_DIR)/libstdc++.so $(BIN_DIR)/deps/
…我可以将 $(BIN_DIR)/deps
中的所有内容转储到安装时的正确位置。
我觉得。