我有一个很大的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
编辑:
我尝试过的更多细节:
auto_ptr
编译时会显示很多警告“已弃用” g++-4.9 -std=c++11
,但没有任何错误并且执行良好。g++-4.9 -std=c++98
。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_ptr
etc...)。在大多数情况下,这样做是值得的(也许该旧库的更新版本已经存在,即 C++14 或 C++17)
混合两个不同版本的C++ 标准库肯定是痛苦的,应该避免。如果你坚持尝试,你需要痛苦地理解所有血腥的细节(所以我真的建议不要尝试这个)。然后阅读 Drepper 的How to write shared libraries论文。
另一种方法可能是让您的软件使用两个不同的进程(一个用于旧的 C++98 源代码,另一个用于新的 C++14 代码)并使用进程间通信设施。这可能是最可靠的解决方案。
出于实际目的,将旧的 C++98 和新的 C++14 视为两种不同且不兼容的编程语言(C++11与其前身确实不同)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句