GCC编译器,如何为低版本的GCC编译应用程序?

3

我正在Debian机器上使用安装有GCC 6.3.0 x64架构开发C ++应用程序,但该应用程序将在Centos上运行,Centos上安装了GCC 4.4.7 x86。

我该如何编译适用于目标环境的应用程序?难道唯一的方法就是在我的主机上安装GCC 4.4.7吗?


1
你可以在 https://wandbox.org/ 上进行编译和运行(例如)。 - SChepurin
1
@SChepurin 我认为这有点偏离重点了! - Lightness Races in Orbit
@Lightness Races in Orbit - 是的,我没有注意到x86和x64的区别。 - SChepurin
1
@LightnessRacesinOrbit 有些编译器会提供可编辑的命令行(例如:http://coliru.stacked-crooked.com/a/93a402a1093f518e),但并不是所有编译器都支持多个版本。例如,Coliru似乎只有g++ 4.9.2、5.1.0、5.2.0和8.2.0。 - Ruslan
1
@Ruslan:哈哈,我从来没有想过可以像那样从Coliru“导出”可执行文件。 - Lightness Races in Orbit
显示剩余2条评论
1个回答

3
您可以使用GCC 6.3进行构建,但是应该使用-D_GLIBCXX_USE_CXX11_ABI=0选项来使用旧的ABI以与GCC早于4.9版本兼容。否则,在目标系统上它将无法正常运行。
为确保兼容性,您确实可以使用目标系统的工具链。但是您不必直接在自己机器上安装它。您可以在运行旧版发行版的虚拟机中进行编译,或者使用docker(或其他容器系统)。

我想进一步扩展这个话题。在Linux上,你通常希望使用与目标相同的工具链进行编译(最好是在目标上),但是GCC非常友好,提供了这个标志来确保兼容性。 - Lightness Races in Orbit
@eerorika,您是指这个标志会使我的应用程序与目标GCC兼容吗? - Mahmoud Emam
1
@MahmoudEmam 我正在和 eerorika 交谈。 - Lightness Races in Orbit
1
@MahmoudEmam 是的,它应该使其兼容。 - eerorika
仅有_GLIBCXX_USE_CXX11_ABI是不够的:它不仅改变了ABI的这个特殊怪癖。使用g++ 6编译的程序将需要在libstdc++.so.6中提供GLIBCXX_3.4.22,而g++ 4.4.7只提供带有GLIBCXX_3.4.13libstdc++.so.6(具体版本号取自此页面)。如果您不在目标系统上安装更新的libstdc++.so,则会从动态链接器获得“找不到版本`GLIBCXX_3.4.22'”等错误。 - Ruslan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接