2013-03-26 5 views
0

В настоящее время я пытаюсь использовать cmake для моего проекта. Структура этого довольно тривиально, состоящий из основной папки и «библиотеки» вложенной также содержащие заголовки и исходные файлы:Правильная настройка подкаталогов с cmake

./   sourceA.cpp ... 
./lib/  sourceB.cpp headerB.cpp ... 

Я хочу, чтобы позволить пользователю определить некоторые константы, которые затем должны быть использованы препроцессором заменить некоторые заполнители, такие как: char data[DIMENSION]

In в главном каталоге я использую следующий CMakeLists.txt, чтобы запросить значение и установить его:

... 
set(DATASET_DIMENSION "4" CACHE STRING "The dimensions of the dataset used.") 
set_property(
    GLOBAL 
    PROPERTY COMPILE_DEFINITIONS DIMENSION=${DATASET_DIMENSION} 
    APPEND 
) 
add_subdirectory(lib) 
... 

в подкаталоге, в CMakeLists.t xt в основном добавляет исходные файлы и вызовы add_library(lib ${lib_SOURCES}).

Проблема: Если я исполняю make, компилятор жалуется, что DIMENSION не был заменен:

.../lib/someheader.h:7:19:error: ‘DIMENSION’ undeclared here (not in a function) 

Что не так с моей конфигурации? Я пытался следовать примеру CMake, где они указывают (курсив мой):

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

ответ

1

Вы должны быть в состоянии просто сделать следующее в главном CMakeLists.txt:

add_definitions(-DDIMENSION=${DATASET_DIMENSION}) 

Проблема в том, что ваша COMPILE_DEFINITIONS не a property of global scope, поэтому установка это не имеет никакого эффекта. Возможно, вы смешаете это с directory-scope property?

+0

Это похоже на работу сейчас. Спасибо! – Patrick

Смежные вопросы