我如何以编程方式确定我的c++运行时库在哪里

How can I programatically determine where my C++ runtime libraries are?

本文关键字:c++ 我的 运行时 在哪里 方式确 编程      更新时间:2023-10-16

我正在使用"hax"在CentOS 6上构建带有GCC 4.8的c++ 11,然后部署在任意CentOS 6目标上(在这些目标上,任何与c++相关的开盒将被构建为带有GCC 4.3的c++ 03)(ref)

为了完成这个工作,我将把我所有的第三方库和g++运行时一起发布,并且rpath我的可执行文件,这样更新的库就可以在适当的地方找到。对于运行时,根据我的计算,我需要发布libstdc++libgcc_s。但是我需要知道它们在我的构建系统中的位置,以便我可以将它们打包。

是否有一些整洁的方式,我可以查询他们的位置从我的包装脚本?

(如果最好的方法太笨拙,我就静态地链接它们,但我想避免这种情况,如果我可以,因为我的项目包括几个可执行文件。此外,如果我静态链接所有,我相信我会运行gpl的风险我的整个项目,例如通过我的c++ MySQL包装库静态链接MySQL C API。我想可以两者兼而有之,尽管有些来源警告不要这样做& help;)

对于奖励点,我是否需要在这个列表中添加任何东西,libssl, libcrypto, libm, libpthread, libc, librt, libzld-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)

& help;那么我的主要构建目标将执行:

ln -sf $(GCC_INSTALL_DIR)/libstdc++.so $(BIN_DIR)/deps/

& help;并且我可以将$(BIN_DIR)/deps中的所有内容转储到安装时的正确位置。

我认为