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。
但是我的gcc 7 build在C++ 17中工作正常,所以必须有一种方法来获得正确的lib而不需要制作一个全新的docker镜像。 – Frank
没错,你有gcc 7编译器,并且你正在启用C++ 17,但它正在从操作系统读取'libstdC++'头文件和所以文件,所以你会得到一个非常棒的C++ 17/C++ 03建立。它这样做是因为它知道你可能有一些外部依赖。任何来自apt-get和需要'libstdC++'的依赖将需要gcc-4系列'libstdC++',并且您将无法一次链接到两个版本的'libstdC++'。如果你的项目有任何你使用'apt-get'满足的依赖关系,你最好的选择就是使用docker镜像。 –
如果您从源代码构建整个编译器和标准库,则可以在您的主目录中配置编译器以使用该版本的stdlib,并制作需要该版本stdlib的程序。但是你可以从ubuntu的ppa中得到的gcc-5不会那样,因为它对运行可靠的任何人都没有用处。他们将被设置为使用可靠的stdlib并在可靠的方面制作有用的程序。归结起来,如果可靠版本的'libstdC++'不适合你,那么你应该使用docker。 –