【发布时间】:2018-12-25 09:18:25
【问题描述】:
我有一个大的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
编辑:
我尝试过的更多细节:
- 子项目中的第三方库在使用
g++-4.9 -std=c++11编译时会显示很多警告“auto_ptris deprecated”,但没有任何错误并且执行良好。 - 它编译良好,没有错误和
g++-4.9 -std=c++98警告。 - 当我使用
g++-8.2编译时,它会喊出许多错误“未定义的引用...”,即使我添加了标志-std=c++98.
我猜这是因为g++-8.2 编译器无法识别auto_ptr 的用法!
我更喜欢只使用一种编译器,它可以让问题变得简单!但是,如果情况不能只使用一个,我想知道如何使用不同的两个编译器设置 Makefile.am,或者解决这个编译问题的任何最佳方法!
【问题讨论】:
-
您需要两个不同的构建目标:一个用于您的程序(库?)和它依赖的文件(目标文件、库等),使用 g++8.2 构建,另一个用于构建g++4.9。如果您需要使用每个编译器进行构建,请设置另一个构建目标,该目标依赖于两个特定于编译器的构建。
-
你确定不能用 g++8.2 构建所有东西吗?也许通过为您认为需要 v4.9 的目标添加一些额外的选项?这将是一个更具前瞻性的解决方案。
-
@JohnBollinger : 我的子项目使用的第三方库 (Hazelcast Client c++) 应该根据这个answer 使用 g++-4.9 或更低版本。我尝试使用 g++-8.2 进行编译,它显示了很多错误,例如“未定义对 ... 的引用”。在使用 g++-4.9 时,它运行良好。那个 Hazelcast Client C++ Library 好像是个老库了!
-
您链接到的 Google 线程是关于 Hazelcast 无法使用太旧、不太新的 C++ 标准库,我在其中没有看到任何关于g++4.9 是极限。如果您自己无法弄清楚,那么提出一个关于使用 g++ 8.2 构建 Hazelcast 的(单独的)问题可能是值得的。仅仅因为您看到很多错误并不一定意味着解决方案很复杂。并且试图在同一个项目中使用不同版本的 C++ 标准库是个坏消息。
-
@eric_hsu:避免评论你自己的问题。 请edit您的问题以改进它。 提及问题中的所有库,并明确告诉我们它们是用什么 C++ 方言编码的(C++98、C++14、C+ +17, ...)
标签: c++ g++ autotools autoconf automake