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

 嘿可爱无罪 发布于 2023-01-31 17: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,看看效果如何。

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有