【问题标题】:Travis CI seems to be reading from the wrong stdlibTravis CI 似乎从错误的标准库中读取
【发布时间】:2017-09-26 03:33:47
【问题描述】:

我刚刚开始使用 travis-CI,所以如果这是一个愚蠢或明显的问题,我深表歉意。

按照说明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

在clang构建中导致以下错误:

/home/travis/build/path_to_project/./include/abulafia/support/type_traits.h:20:12: 错误:命名空间“std”中没有名为“decay_t”的成员;你的意思是 '衰变'?

/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/type_traits:1725:11: 注意:这里声明了'decay'

使用以下命令编译时:

cd /home/travis/build/path_to_project/build/tests/char_set && /usr/bin/clang++-5.0 -Wall -pedantic -Wextra -std=c++17 -I/home/travis/build/path_to_project/./include -I/home/travis/build/path_to_project/googletest/googletest/include -o CMakeFiles/char_set_tests.dir/test_any.cpp.o -c

这告诉我它正在加载 gcc 的库。这里有什么我不明白的地方吗?

谢谢!

【问题讨论】:

    标签: c++ clang c++14 travis-ci


    【解决方案1】:

    是的,这是 travis-ci 构建环境的一个众所周知的问题。它正在编译和链接默认的 ubuntu-trusty libstdc++,这是 gcc 4 系列标准库,甚至不符合 C++11。

    an issue我很久以前开了。

    如果您需要带有 travis-ci 的 C++14 libstdc++,您应该使用 docker 并制作更新的 ubuntu 映像。这是 AFAIK 的最佳解决方法。

    【讨论】:

    • 但是我的 gcc 7 构建在 C++17 中运行良好,因此必须有一种方法可以在不制作全新 docker 映像的情况下获取正确的库。
    • 没错,你有 gcc 7 编译器,并且你正在启用 C++17,但它正在从操作系统读取 libstdc++ 头文件和 so 文件,所以你得到一个 janky C ++17/C++03 构建。它这样做是因为它知道您可能有一些外部依赖项。来自 apt-get 并需要 libstdc++ 的任何依赖项都需要 gcc-4 系列 libstdc++,并且您将无法同时链接到 libstdc++ 的两个版本。如果您的项目有任何使用 apt-get 满足的依赖项,那么最好的选择是使用 docker 映像。
    • 如果您从源代码构建整个编译器和标准库,在您的主目录中,您可以将编译器配置为使用该版本的 stdlib 并制作需要该版本的 stdlib 的程序。但是您从 ubuntu trusty 中的 ppa 获得的 gcc-5 不会是那样的,因为它对运行 trusty 的任何人都没有用。他们将被设置为使用可信赖的标准库并在可信赖的基础上制作有用的程序。归结为,如果您无法接受 libstdc++ 的可靠版本,那么您应该使用 docker。
    • 我的意思是,如果你的依赖足够小,你可以自己编译它们,然后跳过 apt-get。这真的取决于你的项目有多大。我在一些项目中做过类似的事情。但是使用 docker 很快变得更易于维护,这是我的 2 美分。
    【解决方案2】:

    这可以通过安装 g++7 和 clang 来修复,以升级标准库。相关矩阵项变为:

    matrix:
      include:
        - os: linux
          addons:
            apt:
              sources:
                - llvm-toolchain-trusty-5.0
                - ubuntu-toolchain-r-test
              packages:
                - clang-5.0
                - g++-7
          env: MATRIX_EVAL="CC=clang-5.0 && CXX=clang++-5.0"
    

    将其替换为 OP 的 yaml 应该可以解决问题。注意:compiler: clang 是多余的——它的效果会被eval "${MATRIX_EVAL}" 技巧所覆盖。

    【讨论】:

      猜你喜欢
      • 2016-03-22
      • 1970-01-01
      • 2017-01-30
      • 2019-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多