Как определить макрос препроцессора C ++ через командную строку с CMake? - PullRequest
26 голосов
/ 19 декабря 2011

Я пытаюсь установить макрос препроцессора в командной строке CMake.Я пробовал:

set generator="Visual Studio 8 2005"
set params=-D MY_MACRO=1
cmake.exe -G %generator% %params% ..\some_project

, но при компиляции оно не определено, и я не могу найти имя MY_MACRO в файлах, сгенерированных CMake, за исключением CMakeCache.txt, где оно присутствует в форме:

MY_MACRO:UNINITIALIZED=1

Как я могу это сделать?

Ответы [ 4 ]

20 голосов
/ 28 апреля 2012

Хорошей альтернативой было бы определение опции cmake:

OPTION(DEFINE_MACRO "Option description" ON) # Enabled by default

, сопровождаемой условием:

IF(DEFINE_MACRO)
    ADD_DEFINITIONS(-DMACRO)
ENDIF(DEFINE_MACRO)

Затем вы можете включить / выключить эту опцию через командную строку с помощьюcmake используя флаг -D.Пример:

cmake -DDEFINE_MACRO=OFF ..

Чтобы убедиться, что компилятор получает правильное определение, вы можете вызвать make в подробном режиме и проверить, определен макрос или нет:

make VERBOSE=1

ЭтоХорошее решение также потому, что make перекомпилирует ваш код при изменении любого из параметров cmake.

9 голосов
/ 19 декабря 2011

Попробуйте это: -D CMAKE_CXX_FLAGS=/DMY_MACRO=1

3 голосов
/ 08 апреля 2019

Мотивация вопроса заключалась в пакетной сборке сторонних библиотек, поэтому я хотел избежать модификации CMakeLists. Так что спустя годы, даже если мне это больше не нужно, я понял, что это легко достижимо с помощью означает, что он вне CMake :

  • Вызовите CMake как обычно, без специальных флагов.

  • Тогда:

    • С MSVC: Компилятор считывает переменную окружения CL, чтобы получить дополнительные аргументы командной строки. Так

      set CL=/DMY_MACRO=1 %CL%
      

      затем вызовите MSBuild для выполнения своей работы.

    • С другими наборами инструментов: Это может быть выполнимо путем установки CFLAGS или CXXFLAGS переменных среды перед вызовом make, но я не проверял это.

0 голосов
/ 19 декабря 2011

Если у вас нет веской причины , а не , вы должны использовать ADD_DEFINITIONS(<name>=<value>[, ...]).

Просто добавьте следующую строку в ваш файл CMakeLists.txt:

ADD_DEFINITIONS("MY_MACRO=1")

CMake позаботится о синтаксисе переключателей (будь то -D<name>=<value> или /D<name>=<value>).

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