CMake — интеграция параметров в исходные файлы C++

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

Для простоты предположим, что я хочу выполнить только один фрагмент кода, скажем, cout << "print";, внутри example.cpp, если в CMake значение ENABLE_PRINT установлено на ON.

Каталог проекта будет выглядеть так: макет папки

Используя приведенный выше пример, я сделал следующее:

  1. В родительском проекте CMakeLists.txt я добавил OPTION( ENABLE_PRINT "Enable Print" ON)
  2. Затем в файле пример исходной папки подпроекта Config.h я добавил #define ENABLE_PRINT
  3. В Config.h.in, расположенном в примере подпроекта, я добавил #cmakedefine ENABLE_PRINT
  4. Наконец, в исходном файле example.cpp я обвел cout << "print"; внутри #ifdef ENABLE_PRINT и #endif.

После внесения этих изменений проект будет настроен и сгенерирован нормально. Однако, когда я создам программное обеспечение, оно выдаст ошибку и, по сути, скажет мне, что фрагмент кода, который я обвел #ifdef, вообще не выполнялся; это было проигнорировано. Другими словами, описанные выше шаги ничего не сделали, кроме как «закомментировали» фрагмент кода, который я хотел сделать зависимым от ENABLE_PRINT.

Итак, как мне заставить это работать?


person assignment_operator    schedule 09.07.2014    source источник
comment
Не могли бы вы предоставить фактически сгенерированный файл cpp, сгенерированный файл config.h и фактическое сообщение об ошибке компилятора (?)?   -  person Artem Tokmakov    schedule 10.07.2014
comment
Я не уверен, что понял то, о чем вы просите, извините. Вы имеете в виду настоящие файлы или что-то еще, что CMake сгенерирует из них? Если вы имеете в виду настоящие файлы: проект довольно большой, и это было бы ОЧЕНЬ сложно. Тем не менее, мой пример проекта в значительной степени является упрощенной копией того, что происходит. Одна из ошибок: ../vlApplication/libvlapp.a(vlMPIApplication.cpp.o): In function 'VLAPP::MPIApplication::draw()': vlMPIApplication.cpp:(.text+0x3043): undefined reference to 'VLUTIL::Timers::MPITimerManager::syncMultiTimers()   -  person assignment_operator    schedule 10.07.2014
comment
то есть (насколько я могу судить), он не смог найти функцию syncMultiTimers(), которая у меня есть между моими #ifdef   -  person assignment_operator    schedule 10.07.2014
comment
Если это воспроизводит ваш упрощенный проект, этого достаточно. Я хотел бы увидеть example.cpp и Config.h, которые вы упомянули в своем вопросе (при условии, что у вас действительно есть этот небольшой репро-проект). Теперь ошибка, которую вы даете, действительно говорит о том, что этот метод отсутствует. Это тот случай, когда вы ожидаете, что он будет там, т.е. включена ли опция в этом случае? Вы уверены, что ваши ifdefs и макросы верны?   -  person Artem Tokmakov    schedule 10.07.2014


Ответы (1)


Вы можете комбинировать option и add_definitions cmake, например здесь. Так как простой пример понятнее длинного текста вот немного main.c :

 #include<stdio.h>

 int main(int argc, char *argv[])
 {
   printf("start\n");
   #ifdef USE_DEBUG
     printf("Using debug\n");
   #endif
   printf("end\n");
   return 0;
 }

CMakeLists.txt:

cmake_minimum_required (VERSION 2.6)
project (HELLO) 

option(WITH_DEBUG "Use debug" OFF)

if (WITH_DEBUG)
  MESSAGE(STATUS "WITH_DEBUG")
  add_definitions(-DUSE_DEBUG)
endif()

add_executable (main main.c) 

Вы можете попробовать это, набрав cmake . или cmake . -DWITH_DEBUG=ON, затем make и ./main

person francis    schedule 09.07.2014
comment
Это намного элегантнее, чем просмотр файлов конфигурации, и отлично справляется со своей задачей. Замечательный. - person assignment_operator; 10.07.2014