在Travis CI上为C ++ 17设置Clang

Dra*_*-On 5 clang travis-ci c++17

我有一个小的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 / home / 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
Run Code Online (Sandbox Code Playgroud)

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 ()
Run Code Online (Sandbox Code Playgroud)

如果有人知道我在这里做错了,将不胜感激。

val*_*ano 5

我可以注意到这些问题:

  • CXX应该指向 C++ 驱动程序,即:clang++-6.0.
  • 您也 应该-stdlib=libc++在 中指定。CXXFLAGS

罪魁祸首似乎是后者。

如果没有另外指定,clang++ 默认为标准 C++ 头文件的 stdlib++。
构建输出表明标头确实是从 gcc-4.9 中选取的,这很可能是系统 gcc。这解释了构建失败的原因,因为 gcc-4.9 相当旧并且不支持 C++17(更改日志表明它具有实验性 C++14 支持)。is_arithmetic_v构建失败,确实是新的C++17 添加