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

Как определить макрос препроцессора С++ через командную строку с помощью CMake?

Я пытаюсь установить макрос препроцессора в командной строке 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

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

4b9b3361

Ответ 1

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

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

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

    set CL=/DMY_MACRO=1 %CL%
    

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

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

Ответ 2

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

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

Следующее условие:

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

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

cmake -DDEFINE_MACRO=OFF ..

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

make VERBOSE=1

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

Ответ 3

Попробуйте следующее: -D CMAKE_CXX_FLAGS=/DMY_MACRO=1

Ответ 4

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

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

ADD_DEFINITIONS("MY_MACRO=1")

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