提问者:小点点

C++17下Travis CI的设置叮当声


我有一个小的C++17项目,我想为它设置Travis CI。因为它是C++17,所以需要现代编译器;我选择了gcc-7和叮当-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/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的文件中-你是说“is_arithmetic”吗?

同样,它建立在GCC的基础上。我还仔细检查了是否包含了所有必需的头。

My.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 ()

如果有人知道我在这里做错了什么,我们将非常感谢你的帮助。


共1个答案

匿名用户

我可以注意到这些问题:

  • CXX应该指向C++驱动程序,即:Clang++-6.0
  • 还应该在CXXFlags中指定-stdlib=libC++

后者似乎是罪魁祸首。

如果没有另外指定,对于标准C++标头,Clang++默认为stdlib++。
构建输出表明,标头确实是从GCC-4.9中选取的,GCC-4.9很可能是系统GCC。这就解释了构建失败的原因,因为GCC-4.9很旧,不支持C++17(changelog建议它支持实验性的C++14)。构建失败的is_arithmetic_v实际上是新的C++17添加。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++17|travis|ci|设置|叮当声)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?