c++ - 使用 c++11/最近的 g++ 版本 (4.7/4.6) 的可移植性

标签 c++ gcc c++11 portability libstdc++

我最近一直在使用 g++ 4.6 和 g++ 4.7 开发一个程序。我目前正在利用许多 C++11 功能。

我做出这个决定时认为我可以将库与程序一起捆绑在一个子目录中并使用 LD_LIBRARY_PATH。从那以后我发现这是导致我的程序出现段错误的原因。我可能应该早点测试一下吧。它似乎是导致它的捆绑的 libc.so.6(可能是其他人,但绝对是 libc)。

过去,我曾在无法安装库的情况下使用过这种技术,但它运行良好,但我从来不需要将 libc 和 libstdc++ 与程序一起包含在内。

是否有解决此问题的方法,或者我是否必须回滚到较旧的 c++/libc/libstdc++ 版本? (以及随之而来的代码更改的噩梦)

最佳答案

我会避免依赖 LD_LIBRARY_PATH —— 将其用于测试或开发,但不用于生产部署。

而是链接 '-Wl,-rpath,$ORIGIN' 以创建包含 $ORIGINDT_RPATH 标记,这意味着动态链接器将在与可执行文件相同的目录中查找共享库(或者例如使用 '-Wl,-rpath,$ORIGIN/../lib' 在 ../lib 中查找)

如果您的程序的任何部分是使用 G++ 4.7 构建的,那么您需要在运行时使用 GCC 4.7 中的 libstdc++.so。

但如果问题出在 libc.so.6 中,则不是 GCC 问题,我的建议是不要尝试捆绑 libc ...尝试替换系统 libc 可能不是一个好主意。

关于c++ - 使用 c++11/最近的 g++ 版本 (4.7/4.6) 的可移植性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13096322/

相关文章:

c++ - 如何获得足够精确的时间戳,以便每次获取时都不同?

c++ - QT Framework C++ 我如何从另一个类访问 progressBar

android - 链接器剥离未使用的类

将 GNU case 范围扩展转换为标准 C

c++ - 没有 "predicate"的对 vector 上的 max_element

c++ - 为什么 std::result_of<int(int)>::type 无效?

c++ - make后如何运行.o文件

c++ - 使用 TinyXML(链接库?在 C++ 中)

gcc - 将 math.h 与 gprbuild 链接起来

C++11:条件编译:成员