2015-04-02 60 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