繁体   English   中英

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

[英]How do I build binaries for old Linux versions with c++11?

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

但是,现在我们需要针对Ubuntu 10.04。 不幸的是,如果不对源代码进行大量修改,就不可能将tundra2编译到Ubuntu 10.04上,因为它使用了gcc 4.4中没有的许多c ++ 11功能。 我可以升级到较新的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)

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

这就提出了一个问题。 您如何使用较新的编译器功能来定位较旧的平台? 我应该尝试在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)。

Appart认为,如果C ++运行时是静态链接的,则没有理由二进制文件不能在10.04和Centos 5.5上运行。

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

寻找解决该问题的解决方案似乎很普遍,并且没有显示通用解决方案。 我想我将尝试在10.04上编译gcc 4.8,看看效果如何。

如果不对源代码进行大量修改,则无法将tundra2编译到Ubuntu 10.04上

从源代码安装最新,最强大的gcc版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM