Travis CI 结合 Clang 3.4 和 C++11 使用

38

我能否使用支持C++11的Clang来运行Travis CI?(我想使用Clang而不是GCC,因为我已经在Travis CI中安装了GCC 4.8。)预装版本似乎不支持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__技巧,但这与其他内容冲突。

有没有可能让它工作?同时请参阅我的.travis.yml


完成后真是太棒了 =)。顺便说一下,其他人开始使用BuildHive,也许它更适合C++ - oblitum
就个人而言,如果您弄清楚了这个问题,我很想知道如何解决。或许可以回答您自己的问题。 - oblitum
相关问题:https://github.com/travis-ci/travis-ci/issues/1379,https://github.com/travis-ci/travis-ci/issues/979 - Ciro Santilli OurBigBook.com
3个回答

61

现在有更好的方法来做这件事了。

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,即使您拥有 pre-docker 存储库,它也将在 Docker 中构建(以提高速度),根据 Travis 支持文档。

感谢Travis支持的 solarce注意到我的错误并修复文件。


具有C++11支持的clang++怎么样? - Jared Burrows
请查看白名单clang版本兼容性 - cdunn2001
2
我们使用C++11,同时构建g++和clang++。请参阅我们Travis构建中的一个中的-std=c++11。Travis日志的顶部指示了基于docker的构建。您还可以检查.travis.yml 文件中的构建信息。 - cdunn2001
嘿,感谢你的帮助。我已经让它正常工作了。我希望他们能继续提供适当的支持。 - Jared Burrows
1
before_install: 诸如 node_js 的情况下设置 CC & CPP 标志,以避免覆盖标准的 install: 命令。对于测试 https://github.com/audreyt/node-webworker-threads 在 Node 4.x 上非常有用。 - brodybits
显示剩余6条评论

33

这是我的.travis.yml文件的一部分(大多数内容都来自这个文件)。

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

编辑,因为为travis添加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

这个对你还有用吗?无论我尝试什么,我的构建都在 Travis 上失败,显示“未找到' iostream'文件”。 - Jared Burrows
@JaredBurrows 我已经有9个月没有碰过travis了,但我刚刚运行了一个测试,是的,它今天仍然可以工作。https://travis-ci.org/richoux/Wall-in/jobs/61990830 你确定你给出了以下clang选项“-stdlib=libc++”吗? - Florian Richoux
谢谢您发布这个。我会将您的构建与我的进行比较。 - Jared Burrows

1

那么我们可以使用-std=gnu++11-std=gnu++11 -stdlib=libc++,而不是-std=c++11 -stdlib=libc++ - Jared Burrows
@JaredBurrows:如果你使用的是libc++,你根本不会看到这个bug。这个bug是由clang和libstdc++之间的冲突引起的。 - Bill Lynch
1
我正在尝试在TravisCI上构建一个使用C和C++的项目。它在本地使用gcc和clang编译正常,但在TravisCI上失败了,clang编译失败。我正在使用cmake。根据Florian的回答,看起来我在TravisCI上缺少一些库。 - Jared Burrows

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接