使用多个编译器
问题描述:
当使用C++ 14/C++ 11功能和STL包含时,GCC和clang具有不同的行为。 LibC++倾向于隐式包含事物,而libstdC++似乎倾向于需要显式包含。 GCC -Wpedantic似乎比clang更迂腐--Whopantic。使用多个编译器
我想要的是有一个makefile,试图与这两个编译器一起构建,以便发现错误。做这个的最好方式是什么?
答
作为一般规则,make
的工作只能用一个测试一组特定的选项。测试多个配置是一些更高级脚本的工作。
首先,设置您的项目,以便它可以进行树外构建。通常使用名为configure
的脚本来执行此操作。
然后,对于每个配置,创建树外的一个编译:
pushd; mkdir build-gcc-libstdc++ && cd build-gcc-libstdc++ && ../configure CXX='g++'; popd
pushd; mkdir build-gcc-libc++ && cd build-gcc-libc++ && ../configure CXX='g++-libc++'; popd
pushd; mkdir build-clang-libstdc++ && cd build-clang-libstdc++ && ../configure CXX='clang++'; popd
pushd; mkdir build-clang-libc++ && cd build-clang-libc++ && ../configure CXX='clang++-libc++'; popd
(您可能还需要为多个版本的GCC做到这一点,因为头太大改变它们之间有很多)。
要运行它们,这样做:
make -C build-gcc-libstdc++ [targets ...] &&
make -C build-gcc-libc++ [targets ...] &&
make -C build-clang-libstdc++ [targets ...] &&
make -C build-clang-libc++ [targets ...]
但通常我只是建立默认配置,让其他配置特拉维斯捕捉错误。请注意,我不使用libC++:https://github.com/themanaworld/tmwa/blob/master/.travis.yml
什么阻止你制作一个包含makefile中所有这些选项的目标? – 2015-04-03 14:48:52
@CarlNorum Nothing(只记得用'$ {MAKE}'而不是'make'),但是在大多数工作流程中它的用处是非常有限的。对于WIP构建来说,快速周转是最重要的,并且在提交时,如果您键入'make poly' vs'。/ make-poly.sh',则没有多大区别。 – o11c 2015-04-03 18:10:43