CMake командная строка для C ++ #define - PullRequest
27 голосов
/ 02 марта 2012

Мне нужно скомпилировать разные версии определенного проекта, добавив ключи компилятора.Обычно я делал бы это, используя add_definitions или что-то вроде

set_property( TARGET mylib PROPERTY COMPILE_DEFINITIONS _MYDEFINE=1 )

в файле CMakeLists.txt.

В этом конкретном проекте, однако, Мне не разрешено изменять любые источникивключая файл CMakeLists.txt .

Я надеялся, что что-то вроде

cmake -D_MYDEFINE=1 <path to sources>

создаст файл проекта (Visual Studio 2008 в моем случае, но это не должно иметь значения), который включает _MYDEFINE = 1 в свои определения препроцессора, но на самом деле это не так.

Какие у меня варианты здесь?Есть ли другая опция командной строки cmake для достижения этой цели?Не стесняйтесь предлагать решения, не включая командную строку, если изменение CMakeLists.txt проекта не требуется.

Ответы [ 3 ]

25 голосов
/ 02 марта 2012

Мне удалось сделать это сейчас:

Мне удалось убедить всех добавить следующие строки в общий файл CMakeLists.txt:

IF (NOT DEFINED _MYDEFINE)
    SET(_MYDEFINE <default value>)
ENDIF()
ADD_DEFINITIONS(-D_MYDEFINE=${_MYDEFINE})

(Нет, это на самом деле не называется "MYDEFINE", а <значение по умолчанию> просто заполнитель, я просто заменил все это в этом примере)

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

И это позволяет делать

cmake -D_MYDEFINE=<my value> <path to sources>

где это определение cmake будет сопоставлено с определением прекомпилятора C ++, когда cmake создает файл проекта.

9 голосов
/ 02 марта 2012

Контейнер CMakeLists.txt Решение

Хитрое решение:

Ваш доступ только для чтения CMakeList.txt Путь: ${path}/ReadOnlyProject/CMakeLists.txt

Создать новый CMakeList.txt наверх для библиотеки только для чтения (${path}/CMakeLists.txt):

CMAKE_MINIMUM_REQUIRED(VERSION 2.8.0)
PROJECT (FAKE_PROJECT)

ADD_DEFINITIONS(-D_MYDEFINE=1)

ADD_SUBDIRECTORY(ReadOnlyProject)

Теперь используйте новый проект (FAKE_PROJECT) для компиляции.Если ReadOnlyProject не устанавливает определения компилятора напрямую, это может сработать.


В Visual Studio 2010:

Попробуйте изменить c:\Users\${username}\AppData\Local\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props, чтобы добавитьПользовательские настройки компилятора.

Вы должны добавить следующее:

<Project>
  ...
  <ItemDefinitionGroup>
    <ClCompile>
      <PreprocessorDefinitions>__MYDEFINE=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
    </ClCompile>
  </ItemDefinitionGroup>
</Project>
1 голос
/ 20 сентября 2018

Чтобы передать определение препроцессора C ++ или C без изменения каких-либо исходных файлов CMake, используйте переменные окружения CFLAGS для C или CXXFLAGS для C ++ соответственно, например ::

$ export CXXFLAGS="-D_MY_DEFINE=1 -D_MY_OTHER_DEFINE=1"
$ mkdir build
$ cd build
$ cmake ..
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...