Включая правильные версии заголовков STL через CMake Toolchains - PullRequest
3 голосов
/ 08 марта 2019

Я пытаюсь настроить конвейер CI для использования с C ++.Имеющиеся у меня Docker-контейнеры не поддерживают C ++ 17, поэтому я хотел скачать релиз со страницы LLVM и правильно его настроить.Затем я извлекаю это под /opt/clang7.Я также использую файл CMake toolchain, чтобы он брал включения, библиотеки и т.д. из этого дистрибутива Clang.Вот мой файл набора инструментов clang7-ci.cmake:

SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)

SET(CMAKE_C_COMPILER   /opt/clang7/bin/clang)
SET(CMAKE_CXX_COMPILER /opt/clang7/bin/clang++)

SET(CMAKE_FIND_ROOT_PATH  /opt/clang7)

SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

Я называю конфигурацию CMake cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/clang7-ci.cmake .., и она, похоже, подбирает правильный набор clang и clang ++ из набора инструментов.Как я вижу их в выходных данных конфигурации CMake:

- Идентификатор компилятора C - Clang 7.0.1

- Идентификатор компилятора CXX - Clang 7.0.1

- Проверить работающий компилятор C: / opt / clang7 / bin / clang

- Проверить работающий компилятор C: / opt / clang7 / bin / clang - работает

Итак, я предполагаю, что он правильно использует каталог toolchain, иначе как бы он нашел мой установленный компилятор C ++ как clang ++.Тем не менее, это дает мне следующую ошибку, когда я пытаюсь построить с cmake --build .:

В файле, включенном в /builds/meguli/chops/tests/answer_life/answer_life.cpp:2: /builds / meguli / chops / tests / answer_life /../ catch.hpp: 644: 10: ошибка: нет шаблона с именем 'is_same_v' в пространстве имен 'std';Вы имели в виду «is_same»?

           (!std::is_same_v<T, Rest> && ...) && is_unique<Rest...>
              ~~~~~^

/ usr / lib / gcc / x86_64-linux-gnu / 6.3.0 /../../../../ include / c ++ / 6.3.0 / type_traits: 1517: 12: примечание: здесь объявлено «is_same» struct is_same ^

Как вы можете видеть, он ищет в каталоге хоста /usr/lib/.../inclue/6.3.0 для включаемых файлов.Это не то, что я хотел, я хочу построить для C ++ 17, и я хочу, чтобы он включал заголовки из дистрибутива Clang.Я установил SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY), чтобы он искал в цепочке инструментов каталоги включений, но он не работает.Как мне сделать поиск только под /opt/clang7?

1 Ответ

6 голосов
/ 08 марта 2019

Вместо того, чтобы мутировать CMAKE_CXX_FLAGS вручную (вы не должны!) Попробуйте установить стандарт C ++, используемый cmake:

set(CMAKE_CXX_STANDARD 17)

Поставьте это перед определением целей.

Затем нажмите clangпо умолчанию будет использовать libstdc ++ по умолчанию.Чтобы сделать все функции C ++ 17 доступными, просто обновите GCC.

...