Код C ++ 17 не компилируется на Travis с Clang-6.0 - PullRequest
0 голосов
/ 06 октября 2018

Я работал над переносом нашей кодовой базы на 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

Это проблема с Трэвисом?Clang?Мой код?

Если это поможет, полный журнал сборки находится здесь: https://travis -ci.org / turtlecoin / turtlecoin / jobs / 437857481

edit: Forgotчтобы упомянуть - я использую флаги для включения режима C ++ 17, в моих CMakeLists:

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

Спасибо.

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Как сказал @Yakk - Адам Невраумонт, это было вызвано тем, что libstdc ++ не обновлялся.Мы можем решить эту проблему, установив более новый.

Поскольку Travis использует Ubuntu 14.04, мы можем получить libstdc++-7-dev из ubuntu-toolchain-r-test PPA.

В вашей конфигурации 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"
0 голосов
/ 06 октября 2018

Компилятор и используемая вами стандартная библиотека связаны между собой, но не идентичны.

Вероятность того, что ваша локальная стандартная библиотека отличается от удаленной.

Это может бытьlibc ++ vs отличается от стандартной библиотеки libstdc ++, или, возможно, стандартная библиотека Travis как-то не содержит данных.

Одной из новых функций в C ++ 17 является условно явная конструкция кортежа.Так что немного устаревшая / менее совместимая библиотека std выдаст вам именно эту ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...