2014-03-01 41 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++。 –