gpt4 book ai didi

c++11 - 如何使用 c++11 为旧 Linux 版本构建二进制文件?

转载 作者:行者123 更新时间:2023-12-04 21:43:04 29 4
gpt4 key购买 nike

我们已经开始使用跨平台构建工具 tundra2 在不同平台上构建我们的应用程序二进制文件。它运作良好。

但是,现在我们需要针对 Ubuntu 10.04。不幸的是,如果不对源代码进行大量返工,就无法将 tundra2 编译到 Ubuntu 10.04 上,因为它使用了许多在 gcc 4.4 中不可用的 c++11 功能。我可以升级到较新的 gcc,但不能升级到能够编译代码的 gcc。

所以我想我会尝试在较新的平台上构建 tundra2 并将 tundra2 二进制文件复制到 10.04。不幸的是,我收到了这些错误:

(lucid_amd64)matt@blaze:~/dev/OTOY2/extern/tundra2/build$ ./tundra2 
./tundra2: /lib/libc.so.6: version `GLIBC_2.14' not found (required by ./tundra2)
./tundra2: /lib/libc.so.6: version `GLIBC_2.15' not found (required by ./tundra2)

我尝试将 g++ 与 -static-libstdc++ 和 -static-libgcc 选项静态链接,但错误仍然存​​在。

这就提出了一个问题。您如何针对具有较新编译器功能的旧平台?
我应该尝试在 Ubuntu 10.04 上编译 GCC 4.8 吗?

在阅读和了解了更多关于 gnu c 链接器的知识后,我认为我需要知道的更多。似乎导致依赖的函数是 2.15 中引入的名为 __fdelt_chk 的函数。
与范围检查有关。我将尝试将其关闭或为它实现一个虚拟对象。此外,memcpy 需要 2.14,但在 Ubuntu 10.04 上不可用。

编辑。
似乎在 2.14 和 2.15 中引入了两个常见的更改。
在 2.14 中,我读到 memcpy 已在内部更新为 memmove 调用。
在 2.15 中,引入了内存边界检查(这就是 __fdelt_chk)。

除此之外,如果 C++ 运行时是静态链接的,那么二进制文件就没有理由不能在 10.04 和 Centos 5.5 上运行。

那么我们如何处理这些呢?我试过 memcpy 包装器,但由于某种原因不起作用。它仍然试图寻找 2.14。将 -fno-stack-protector 和 -U_FORTIFY_SOURCE 放在编译和链接行的末尾实际上并没有删除它。我还与 pthreads 等其他库链接,所以我不知道是否需要它。

似乎寻找这个问题的解决方案实际上很常见,并且没有显示通用的解决方案。我想我会尝试在 10.04 上编译 gcc 4.8,看看它的表现如何。

最佳答案

compiling tundra2 onto Ubuntu 10.04 is not possible without significant rework of the source code



从源代码安装最新和最好的 gcc 版本。

关于c++11 - 如何使用 c++11 为旧 Linux 版本构建二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21323776/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com