我有一个小的C ++ 17项目,我想为其设置Travis CI。由于它是C ++ 17,因此需要现代编译器。我选择了gcc-7和clang-6。虽然gcc构建可以很好地编译和链接,但我一生都无法弄清楚如何正确设置clang。看起来它总是使用过时的预装gcc的标准库实现,而不是它自己的。
travis日志在cmake --build . -- VERBOSE=1
上显示以下几行:
/usr/bin/clang-6.0 -I / home / travis / build / myuser / perlin / include -g -std = gnu ++ 1z -o CMakeFiles / perlin.dir / main.cpp.o -c /主页/travis/build/myuser/perlin/main.cpp
在/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/algorithm:62包含的文件中: 在/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_algo.h:66中包含的文件中: 在/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/random:38中包含的文件中: 在/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/cmath:44包含的文件中: /home/travis/build/myuser/perlin/include/math.h:48:28:错误:命名空间“ std”中没有名为“ is_arithmetic_v”的模板;你是说'is_arithmetic'吗?
同样,它在gcc上构建良好。我还仔细检查了是否包括所有必需的标题。
我的.travis.yml看起来像这样:
language: cpp
dist: trusty
matrix:
include:
- os: linux
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- g++-7
- libpng-dev
env:
- MATRIX_EVAL="CC=gcc-7 && CXX=g++-7"
- LINKER_FLAGS=""
- os: linux
addons:
apt:
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-trusty-6.0
- sourceline: 'deb http://apt.llvm.org/trusty/ llvm-toolchain-trusty-6.0 main'
key_url: 'https://apt.llvm.org/llvm-snapshot.gpg.key'
packages:
- clang-6.0
- libstdc++6
- libpng-dev
env:
- MATRIX_EVAL="CC=clang-6.0 && CXX=clang-6.0"
- LINKER_FLAGS="-stdlib=libc++ -lc++abi"
before_install:
- eval "${MATRIX_EVAL}"
script:
- cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_EXE_LINKER_FLAGS=${LINKER_FLAGS} .
- cmake --build . -- VERBOSE=1
CMakeLists.txt:
cmake_minimum_required(VERSION 3.9)
project(perlin)
set(CMAKE_CXX_STANDARD 17)
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pedantic")
endif()
add_library(noise INTERFACE)
target_sources(noise INTERFACE
${PROJECT_SOURCE_DIR}/include/seamless_noise_generator_2d.h
${PROJECT_SOURCE_DIR}/include/fractal_noise_generator.h
${PROJECT_SOURCE_DIR}/include/perlin_noise_generator.h
${PROJECT_SOURCE_DIR}/include/point.h
${PROJECT_SOURCE_DIR}/include/vector.h
${PROJECT_SOURCE_DIR}/include/math.h)
target_include_directories(noise INTERFACE include)
find_package(PNG)
if (PNG_FOUND)
add_executable(noise_test main.cpp)
target_link_libraries(noise_test ${PNG_LIBRARY} noise m)
else()
message(info "Did not find libpng. Not building test executable.")
endif ()
如果有人知道我在这里做错了,将不胜感激。
答案 0 :(得分:3)
我会注意到这些问题:
CXX
应该指向C ++驱动程序,即:clang++-6.0
。-stdlib=libc++
中指定CXXFLAGS
。 后者似乎是罪魁祸首。
如果没有另外指定,对于标准C ++标头,clang ++默认为stdlib ++。
构建输出表明标头确实是从gcc-4.9中选择的,这很可能是系统gcc。这说明了构建失败的原因,因为gcc-4.9已经很旧并且不支持C ++ 17(changelog表示它具有实验性的C ++ 14支持)。未能通过构建的is_arithmetic_v
实际上是新的C++17 addition。