Travis CI似乎是从错误的stdlib读取

问题描述:

我刚开始使用travis-CI,所以我很抱歉如果这是一个愚蠢或明显的问题。Travis CI似乎是从错误的stdlib读取

继说明here

我写了下面travis.yml

language: cpp 

dist: trusty 

matrix: 
    include: 
    - os: linux 
     compiler: gcc 
     addons: 
     apt: 
      sources: 
      - ubuntu-toolchain-r-test 
      packages: 
      - g++-7 
     env: 
     - MATRIX_EVAL="CC=gcc-7 && CXX=g++-7" 
    - os: linux 
     compiler: clang 
     addons: 
     apt: 
      sources: 
      - llvm-toolchain-trusty-5.0 
      packages: 
      - clang-5.0 
     env: 
     - MATRIX_EVAL="CC=clang-5.0 && CXX=clang++-5.0" 

before_install: 
    - eval "${MATRIX_EVAL}" 

script: 
    - mkdir build 
    - cd build 
    - cmake -DCMAKE_VERBOSE_MAKEFILE=ON .. 
    - cmake --build . 
    - ctest 

这将导致以下错误在铛编译:

/home/travis/build/FrancoisChabot/abulafia/./include/abulafia/support/type_traits.h:20:12: error: no member named 'decay_t' in namespace 'std'; did you mean 'decay'?

/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/type_traits:1725:11: note: 'decay' declared here

当用下面的命令编译:

cd /home/travis/build/FrancoisChabot/abulafia/build/tests/char_set && /usr/bin/clang++-5.0 -Wall -pedantic -Wextra -std=c++17 -I/home/travis/build/FrancoisChabot/abulafia/./include -I/home/travis/build/FrancoisChabot/abulafia/googletest/googletest/include -o CMakeFiles/char_set_tests.dir/test_any.cpp.o -c

这告诉我它正在加载gcc的库。我在这里有什么不了解的吗?

link to the full log如果有什么重要的我ommited。

谢谢!

是的,这是Travis-ci构建环境中的一个众所周知的问题。它正在编译并链接到默认的ubuntu-trusty libstdc++,这是gcc 4系列stdlib,甚至不符合C++ 11标准。

请参阅an issue很久以前我打开了。

如果您需要带有travis-ci的C++ 14 libstdc++,您应该使用docker并创建一个更新的ubuntu映像。这是最好的解决方法AFAIK。

+0

但是我的gcc 7 build在C++ 17中工作正常,所以必须有一种方法来获得正确的lib而不需要制作一个全新的docker镜像。 – Frank

+0

没错,你有gcc 7编译器,并且你正在启用C++ 17,但它正在从操作系统读取'libstdC++'头文件和所以文件,所以你会得到一个非常棒的C++ 17/C++ 03建立。它这样做是因为它知道你可能有一些外部依赖。任何来自apt-get和需要'libstdC++'的依赖将需要gcc-4系列'libstdC++',并且您将无法一次链接到两个版本的'libstdC++'。如果你的项目有任何你使用'apt-get'满足的依赖关系,你最好的选择就是使用docker镜像。 –

+0

如果您从源代码构建整个编译器和标准库,则可以在您的主目录中配置编译器以使用该版本的stdlib,并制作需要该版本stdlib的程序。但是你可以从ubuntu的ppa中得到的gcc-5不会那样,因为它对运行可靠的任何人都没有用处。他们将被设置为使用可靠的stdlib并在可靠的方面制作有用的程序。归结起来,如果可靠版本的'libstdC++'不适合你,那么你应该使用docker。 –