2014-03-01 40 views
38

是否有可能得到特拉維斯CI與Clang的工作能夠C + + 11? (我想要Clang,而不是GCC,我已經在Travis CI中使用了GCC 4.8)。似乎預裝的版本不是C++ 11的能力。我所有的努力,在安裝任何新版本最終failing because of this特拉維斯CI與Clang 3.4和C++ 11

In file included from /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/move.h:57: 
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/type_traits:269:39: error: 
use of undeclared identifier '__float128' 
struct __is_floating_point_helper<__float128> 

我已經看到了-D__STRICT_ANSI__ trick但衝突與其他的東西給我。

它有可能得到它的工作?另見我的.travis.yml

+0

真棒,如果你把它做=)。順便說一下,其他人開始使用[BuildHive](https://buildhive.cloudbees.com/),也許它更友好[用於C++](http://wiki.cloudbees.com/bin/view/DEV/ C +和+ C%2B%2B +構建) –

+0

我個人想知道如何解決這個問題。也許回答你自己的答案。 –

+0

相關問題:https://github.com/travis-ci/travis-ci/issues/1379,https://github.com/travis-ci/travis-ci/issues/979 –

回答

33

這是我的.travis.yml文件的一部分(主要取自this file)。

language: cpp 

compiler: 
    - clang 
    - gcc 

before_install: 
    # g++4.8.1 
    - if [ "$CXX" == "g++" ]; then sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test; fi 

    # clang 3.4 
    - if [ "$CXX" == "clang++" ]; then sudo add-apt-repository -y ppa:h-rayflood/llvm; fi 

    - sudo apt-get update -qq 

install: 
    # g++4.8.1 
    - if [ "$CXX" = "g++" ]; then sudo apt-get install -qq g++-4.8; fi 
    - if [ "$CXX" = "g++" ]; then export CXX="g++-4.8"; fi 

    # clang 3.4 
    - if [ "$CXX" == "clang++" ]; then sudo apt-get install --allow-unauthenticated -qq clang-3.4; fi 
    - if [ "$CXX" == "clang++" ]; then export CXX="clang++-3.4"; fi 

script: 
    - $CXX --version 

編輯,因爲它可以增加的libC++特拉維斯 - 非常有用的。據我所知,libC++沒有Linux包,所以必須「手動」編譯它。在使用clang編譯時,不要忘記在CXXFLAGS中使用-stdlib = libC++

install: 
    # clang 3.4 
    - if [ "$CXX" == "clang++" ]; then sudo apt-get install --allow-unauthenticated -qq clang-3.4; fi 
    - if [ "$CXX" == "clang++" ]; then export CXXFLAGS="-std=c++0x -stdlib=libc++"; fi 
    - if [ "$CXX" == "clang++" ]; then svn co --quiet http://llvm.org/svn/llvm-project/libcxx/trunk libcxx; fi 

    - if [ "$CXX" == "clang++" ]; then cd libcxx/lib && bash buildit; fi 
    - if [ "$CXX" == "clang++" ]; then sudo cp ./libc++.so.1.0 /usr/lib/; fi 
    - if [ "$CXX" == "clang++" ]; then sudo mkdir /usr/include/c++/v1; fi 
    - if [ "$CXX" == "clang++" ]; then cd .. && sudo cp -r include/* /usr/include/c++/v1/; fi 
    - if [ "$CXX" == "clang++" ]; then cd /usr/lib && sudo ln -sf libc++.so.1.0 libc++.so; fi 
    - if [ "$CXX" == "clang++" ]; then sudo ln -sf libc++.so.1.0 libc++.so.1 && cd $cwd; fi 

    - if [ "$CXX" == "clang++" ]; then export CXX="clang++-3.4"; fi 
+0

這是否仍適用於您?無論我嘗試什麼,我的構建都會在Travis上找不到「iostream」文件。 –

+0

@JaredBurrows我沒有接觸Travis 9個月,但我只是進行測試,是的,它今天仍然有效。 https://travis-ci.org/richoux/Wall-in/jobs/61990830 你確定你給了下面的叮聲選項:-stdlib = libC++' –

+0

謝謝你發佈這個。我會比較你的構建和我的。 –

1

看來,鏗鏘的開發者修復這個時,你建立在-std=gnu++11模式。

你能夠用那個標誌而不是__STRICT_ANSI__來建造嗎?

+0

因此,我們可以使用-std = gnu ++ 11或-std = gnu ++ 11 -stdlib = libC++'而不是'-std = C++ 11 -stdlib = libC++'? –

+0

@JaredBurrows:如果你使用的是libC++,你根本看不到這個bug。這個bug是由於clang和libstdC++之間的衝突造成的。 –

+1

我想獲得一個項目,建立在使用C和C++的TravisCI上。它使用gcc和clang(本地)進行編譯,但不在TravisCI上編譯,clang失敗。我正在使用cmake。根據弗洛裏安的回答,TravisCI似乎錯過了這些庫。 –

60

現在有a better way to do this

sudo: false 
dist: trusty 
language: cpp 
os: 
    - linux 
compiler: 
    - gcc 
    - clang 
install: 
# /usr/bin/gcc is 4.6 always, but gcc-X.Y is available. 
- if [[ $CXX = g++ ]]; then export CXX="g++-4.9" CC="gcc-4.9"; fi 
# /usr/bin/clang has a conflict with gcc, so use clang-X.Y. 
- if [[ $CXX = clang++ ]]; then export CXX="clang++-3.5" CC="clang-3.5"; fi 
addons: 
    apt: 
    sources: 
    - ubuntu-toolchain-r-test 
    - llvm-toolchain-precise-3.5 # not sure why we needed this 
    packages: 
    - gcc-4.9 
    - g++-4.9 
    - clang-3.5 

(顯式sudo: false會讓它在泊塢建(速度),即使你有一個碼頭工人預回購,根據特拉維斯支持。)

感謝solarce在用於察覺特拉維斯支持我錯誤和修復文檔。

+0

怎麼樣鏗鏘++與c + + 11支持? –

+0

參見[白名單](https://github.com/travis-ci/apt-package-whitelist/blob/master/ubuntu-precise)和[鏗鏘版本兼容性](http://clang.llvm.org/ cxx_status.html)。 – cdunn2001

+0

謝謝。我看到白名單沒有鏗鏘聲++。所以我猜叮噹的C++ 11不適用於travisci?我手動設置libC++。 –