C ++ 17代码未在Clang-6.0的Travis上编译

时间:2018-10-05 23:20:51

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

我一直在努力将代码库迁移到C ++ 17,现在已经使其在本地与g ++和clang一起使用。

但是,我在Travis上都遇到了Clang 6.0和Clang 5.0编译失败的问题,据说这两个版本都支持C ++ 17。

此外,使用Clang 6.0在我的计算机上编译相同的代码成功。

失败的相关代码通过大括号初始化返回元组,例如:

return {str.str(), key};

我收到的具体错误消息是:

/home/travis/build/turtlecoin/turtlecoin/src/Mnemonics/Mnemonics.cpp:51:20: error: chosen constructor is explicit in copy-initialization
            return {str.str(), key};
                   ^~~~~~~~~~~~~~~~ /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/tuple:539:19: note: explicit constructor declared here
        constexpr tuple(_U1&& __a1, _U2&& __a2)

似乎正在按预期使用clang-6.0:

-- Check for working C compiler: /usr/bin/clang-6.0
-- Check for working C compiler: /usr/bin/clang-6.0 -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/clang++-6.0
-- Check for working CXX compiler: /usr/bin/clang++-6.0 -- works

我的本​​地叮当声很好:

clang version 6.0.1 (tags/RELEASE_601/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin

这是Travis的问题吗?铛?我的代码?

如果有帮助,则完整的构建日志在此处: https://travis-ci.org/turtlecoin/turtlecoin/jobs/437857481

编辑:忘了提及-我正在使用这些标志在我的CMakeLists中启用C ++ 17模式:

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

谢谢。

2 个答案:

答案 0 :(得分:2)

正如@Yakk-Adam Nevraumont所说,这是由于libstdc ++尚未更新引起的。我们可以通过安装较新的版本来解决此问题。

由于Travis使用Ubuntu 14.04,因此我们可以从libstdc++-7-dev PPA中获取ubuntu-toolchain-r-test

在您的travis配置中:

- os: linux
    compiler: clang
    addons:
      apt:
        sources:
        - ubuntu-toolchain-r-test
        - llvm-toolchain-trusty-6.0
        packages: 
          - clang-6.0
          - libstdc++-7-dev
    env:
    - MATRIX_EVAL="CC=clang-6.0 && CXX=clang++-6.0"

答案 1 :(得分:1)

您使用的编译器和标准库是两个相连的东西,但不完全相同。

奇怪的是您的本地标准库与远程标准库不同。

可能是libc ++与libstdc ++标准库不同,或者Travis标准库某种程度上没有数据。

C ++ 17的新功能之一是有条件的显式元组构造。因此,稍微过时/不太符合标准的std库会为您提供该错误。