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

How can I compile with different version of g++ in c++ Autotools project

我有一个很大的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. 子项目中的第三方库在用g++-4.9 -std=c++11编译时会出现很多warnings "auto_ptr is deprecated",但没有报错,执行良好。
  2. 使用 g++-4.9 -std=c++98.
  3. 编译成功,没有错误和警告
  4. 当我用 g++-8.2 编译时,它会大喊很多错误 "undefined reference to ...",即使我添加了标志 -std=c++98.

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

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

My question is how to compile the whole project with different version of g++.

有可能,但我不推荐。 GNU 构建系统对此不提供任何支持,但您可以查看 AX_CC_FOR_BUILD 如何实现类似的想法(为构建和主机启用编译器)。

想法 #2 是 @JohnBollinger 建议的——选择一个编译器并用它构建。 与必须设置两个编译器相比,您构建的最终用户会更欣赏这一点。这是我会选择的解决方案,因为 GNU 构建系统以这种方式工作。如果旧代码由于某种原因不能现代化,g++-8.2 可以被告知从以前版本的 C++ 编译代码。

想法 3 基本上是将您的项目拆分为两个 autotools 项目——一个使用旧编译器编译,一个使用新编译器编译。也不太喜欢这个想法。

I have a big autotools project, and one part of codes in the subdirectory use g++-4.9 to compile, others use g++8.2.

My question is how to compile the whole project with different version of g++.

我不建议这样做。 ABI 约定可能已更改(因此恕我直言,不建议使用不同 ABI 的两个不同 GCC 进行编译)。

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

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

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

最后,您可以考虑修补旧库的源代码,使其与 C++14 兼容(特别是,删除每个出现的 auto_ptr 并明智地用 unique_ptr 替换它们ETC...)。在大多数情况下,这样做是值得的(也许旧库的更新版本已经存在,即 C++14 或 C++17)

混合 C++ standard library is certainly painful and should be avoided. If you insist trying that, you need to understand painfully all the gory details (so I really recommend not trying this). Then read Drepper's How to write shared libraries 论文的两个不同版本。

另一种方法是让您的软件使用两种不同的 processes (one for the old C++98 source code, another for the new C++14 code) and use inter-process communication 工具。这可能是最可靠的解决方案。

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