首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Travis CI上为C++17设置Clang

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

Stack Overflow用户
提问于 2018-07-21 14:41:02
回答 1查看 2.3K关注 0票数 7

我有一个小的C++17项目,我想为其设置Travis。因为它是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‘的模板;你是说“是算术”吗?

再一次,它建立在gcc身上。我还检查了所有必需的头是否都包括在内。

我的.travis.yml看起来是这样的:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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 ()

如果有人知道我在这里做错了什么,我们会非常感激的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-25 06:26:35

我可以注意到这些问题:

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

后者似乎是罪魁祸首。

如果没有另外指定,clang++默认为标准C++标头的stdlib++。

构建输出表明,标题确实是从gcc-4.9中挑选出来的,这很可能是gcc的系统。这就解释了构建失败的原因,因为gcc-4.9已经很老了,而且不支持C++17 (变化量g表示它有实验性的C++14支持)。构建失败的is_arithmetic_v确实是新的C++17加法

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51457083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档