2015-04-02 69 views
0

当使用C++ 14/C++ 11功能和STL包含时,GCC和clang具有不同的行为。 LibC++倾向于隐式包含事物,而libstdC++似乎倾向于需要显式包含。 GCC -Wpedantic似乎比clang更迂腐--Whopantic。使用多个编译器

我想要的是有一个makefile,试图与这两个编译器一起构建,以便发现错误。做这个的最好方式是什么?

回答

1

作为一般规则,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

+0

什么阻止你制作一个包含makefile中所有这些选项的目标? – 2015-04-03 14:48:52

+0

@CarlNorum Nothing(只记得用'$ {MAKE}'而不是'make'),但是在大多数工作流程中它的用处是非常有限的。对于WIP构建来说,快速周转是最重要的,并且在提交时,如果您键入'make poly' vs'。/ make-poly.sh',则没有多大区别。 – o11c 2015-04-03 18:10:43