Подтвердить что ты не робот

Передача параметров компилятора cmake

Я знаю, как передавать параметры компилятора с помощью команды cmake

set(CMAKE_CXX_FLAGS "-Wall -Wno-dev -Wl,-rpath=/home/abcd/libs/")

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

cmake -Wl,-rpath=/home/abcd/newlibs/ path/to/CMakeLists.txt

или

cmake -D CMAKE_CXX_FLAGS="-Wno-dev -Wl,-rpath=/home/abcd/libs/" path/to/CMakeLists.txt

Моя основная проблема заключается в том, что я хочу знать, как добавлять флаги и как переопределять существующие флаги компилятора из командной строки.

4b9b3361

Ответ 1

Да, вы можете добавить параметры компилятора и компоновщика. Но есть две вещи, которые вы должны различить в CMake: первый вызов для генерации среды сборки и все последовательные вызовы для повторной генерации этой среды сборки после изменений в ваших файлах или зависимостях CMakeList.txt.

Вот некоторые из возможностей (за исключением более сложных вариантов набора инструментов):

Добавить флаги компилятора

  1. Исходное содержимое из кэшированной переменной CMAKE_CXX_FLAGS представляет собой комбинацию CMAKE_CXX_FLAGS_INIT, установленную самим CMake во время обнаружения OS/toolchain, и всего, что установлено в переменной среды CXXFLAGS. Таким образом, вы можете сначала позвонить:

    cmake -E env CXXFLAGS="-Wall" cmake ..
    
  2. Позже CMake будет ожидать, что пользователь изменяет кэшированную переменную CMAKE_CXX_FLAGS напрямую, чтобы добавлять вещи, например. используя редактор, такой как ccmake, коммит с CMake.

  3. Вы можете легко представить свой собственный тип сборки, например ALL_WARNINGS. Отдельные части типа сборки добавлены:

     cmake -DCMAKE_CXX_FLAGS_ALL_WARNINGS:STRING="-Wall" -DCMAKE_BUILD_TYPE=ALL_WARNINGS ..
    

Добавить флаги компоновщика

Параметры компоновщика более или менее эквивалентны параметрам компилятора. Только то, что имена переменных CMake зависят от типа цели (EXE, SHARED или MODULE).

  1. CMAKE_EXE_LINKER_FLAGS_INIT, CMAKE_SHARED_LINKER_FLAGS_INIT или CMAKE_MODULE_LINKER_FLAGS_INIT объединяются с переменной среды LDFLAGS до CMAKE_EXE_LINKER_FLAGS, CMAKE_SHARED_LINKER_FLAGS и CMAKE_MODULE_LINKER_FLAGS.

    Так, например, вы можете позвонить:

    cmake -E env LDFLAGS="-rpath=/home/abcd/libs/" cmake ..
    
  2. Смотрите выше.

  3. Части, относящиеся к типу сборки, добавлены:

    cmake -DCMAKE_SHARED_LINKER_FLAGS_MY_RPATH:STRING="-rpath=/home/abcd/libs/" -DCMAKE_BUILD_TYPE=MY_RPATH ..
    

Альтернативы

Просто помните, что CMake предоставляет специальную переменную для установки флагов компилятора/компоновщика независимо от платформы. Так что вам не нужно знать конкретную опцию компилятора/компоновщика.

Вот несколько примеров:

К сожалению, для уровня предупреждения компилятора нет (пока)

Ссылки

Ответ 2

cmake -D CMAKE_CXX_FLAGS="-Wno-dev -Wl,-rpath=/home/abcd/libs/" path/to/CMakeLists.txt

это должно работать, проблема в том, что если у вас find_package() какой-то пакет, который также изменяет CMAKE_CXX_FLAGS, то он будет работать не только частично.