我如何以编程方式确定我的C ++运行时库的位置?

时间:2016-08-17 16:16:39

标签: c++ gcc libstdc++

我使用" hax"在CentOS 6上使用GCC 4.8构建C ++ 11,然后在任意CentOS 6目标上部署(任何与C ++相关的开箱即用的目标)使用GCC 4.3)ref构建为C ++ 03。

为了完成这项工作,我将发送所有第三方库以及g ++运行时和rpath我的可执行文件,以便确保在适当的位置找到新的库。对于运行时,根据我的统计,我需要发送libstdc++libgcc_s。但我需要知道它们在我的构建系统中的位置,以便我可以打包它们。

我是否可以通过我的打包脚本查询其位置?

(如果最好的方法太尴尬我只是静态地链接它们,但是如果我可以,因为我的项目包含几个可执行文件,我想避免这种情况。另外如果我静态地链接一切我相信我冒着GPL整个项目的风险,例如通过我的C ++ MySQL包装器lib静态链接MySQL C API。可以两者兼而有之,我假设,虽然some sources warn against this ...)

对于奖励积分,我是否需要在libssllibcryptolibmlibpthreadlibc,{librtlibz中添加任何内容。 {1}},ld-linux-x86-64<!-- ko foreach: teamMembers --> <tr> <!-- ko foreach: days --> <td> <!-- ko foreach: shifts --> <input type="text" data-bind="value: startTime"> <input type="text" data-bind="value: endTime"> <!-- /ko --> </td> <!-- /ko --> </tr> <!-- /ko -->

2 个答案:

答案 0 :(得分:6)

如果我理解正确,您已经构建了二进制文件,并且只想获取运行时库列表以将它们与二进制文件打包在一起?您可以尝试使用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()使用的库。

答案 1 :(得分:1)

在我的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中的所有内容转储到正确的位置。

我想。