如何在 c++ Autotools 项目中使用不同版本的 g++ 进行编译

舒克姆

我有一个很大的autotools项目,子目录下一部分代码使用g++-4.9编译,其他使用g++8.2。

我的问题是如何使用不同版本的 g++ 编译整个项目。

我看到一些相关的问题是更改不同的 g++ 编译器,一般答案是设置环境变量或make选项。

但是,我的问题是同时使用 g++8.2 和 g++4.9 进行编译。

我希望有一些解决方案可以将Makefile.am设置为

noinst_PROGRAMS=foo bar
foo_CXX_COMPILER=/usr/bin/g++-4.9

bar_CXX_COMPILER=/usr/bin/g++-8.2

编辑:

我尝试过的更多细节

  1. 子项目中的第三方库在auto_ptr编译时会显示很多警告“已弃用” g++-4.9 -std=c++11,但没有任何错误并且执行良好。
  2. 它编译得很好,没有错误和警告g++-4.9 -std=c++98
  3. 当我用 编译时g++-8.2它会发出许多错误“未定义的引用...” ,即使我添加了标志-std=c++98.

我猜这是因为g++-8.2编译器无法识别auto_ptr用法!

我更喜欢只使用一个编译器,这使问题变得简单!但是,如果情况不允许只使用一个,我想知道如何使用不同的两个编译器设置 Makefile.am,或者任何解决此编译问题的最佳方法!

巴西尔·斯塔林克维奇

我有一个很大的autotools项目,子目录下一部分代码使用g++-4.9编译,其他使用g++8.2。

我的问题是如何使用不同版本的 g++ 编译整个项目。

我不建议这样做。ABI(不推荐恕我直言,以不同的ABI的两个不同的GCC的编译等等)约定可能已经改变。

实际上,我建议使用相同的(最新的)GCC 构建所有项目,即使用g++8.2

如果项目的某些部分使用不同的 C++ 方言,您可以显式地将某些-std=c++11-std=c++17选项传递给它们。

因此,只需将您的项目配置为使用相同(和最新)的 GCC。如果某些 C++ 方言不同,请将特定标志传递给它。请参阅控制 C++ 方言的-std=选项选项

最后,您可以考虑修补旧库的源代码以使其符合 C++14(特别是,删除所有出现的内容auto_ptr并明智地替换为unique_ptretc...)。在大多数情况下,这样做是值得的(也许该旧库的更新版本已经存在,即 C++14 或 C++17)

混合两个不同版本的C++ 标准库肯定是痛苦的,应该避免。如果你坚持尝试,你需要痛苦地理解所有血腥的细节(所以我真的建议不要尝试这个)。然后阅读 Drepper 的How to write shared libraries论文。

另一种方法可能是让您的软件使用两个不同的进程(一个用于旧的 C++98 源代码,另一个用于新的 C++14 代码)并使用进程间通信设施。这可能是最可靠的解决方案。

出于实际目的,将旧的 C++98 和新的 C++14 视为两种不同且不兼容的编程语言(C++11与其前身确实不同)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Netbeans中使用-g选项进行编译?

如何在 autotools 项目中添加/使用 --with-package arg?

如何在Autotools项目中链接刚刚构建的库

使用多核与g ++进行编译

如何在g ++中使用C ++ 11?

如何在Maven项目中使用-Xlint:unchecked进行编译?

如何在MSBuild项目中使用特定版本的F#编译器?

mysql C ++将无法使用make进行编译,但如果将g ++参数放在cmd行上,则将进行编译

如何在CMAKE中针对不同文件使用不同的编译选项进行编译?

如何在GitHub中使用不同版本的PHP进行测试

C / C ++ Cyanogenmod如何使用不同版本的工具链编译内核?

如何在Visual Studio 2013的C ++项目中编译和链接Google测试,但如何使用NuGet软件包管理器安装的Gtest进行链接?

包含类并使用g ++进行编译

尝试使用Codelite / G ++进行编译

如何在iOS中仅选择特定的C文件以使用xCode进行编译

使用g ++的C ++ XInput编译

如何使用C#6.0为.NET 2.0进行编译?

如何使用make和C99进行编译?

引导加载程序-如何使用C进行向前编译

如何在最新版本的g ++中使用C ++ 11功能

如何在C#项目中使用LIB文件?

如何在 C 项目中使用 WordNet?

如何在C ++项目中使用Swift静态库(.a)?

如何在MacOS上的C ++项目中使用DCMTK

如何在cmake项目中使用c ++ 20

如何在C ++项目中使用共享动态库?

如何在一个项目中使用不同的语言

使用 autotools 如何让 pandoc 在 c 程序旁边的 src 目录中运行

如何在IDE中使用DCC32进行编译