2012-06-28 2 views
0

Мне назначили полностью запустить проект с помощью CMake.Избегайте нескольких директив include_directories с использованием Cmake

В принципе, проект имеет более 20 модулей, и для каждого модуля я создал файл CMake , такие как:

# Module: CFS 
file(
    GLOB_RECURSE 
    files 
    *.c 
    *.cpp 
) 

include_directories("${PROJECT_SOURCE_DIR}/include/PEM/cfs") 
include_directories("${PROJECT_SOURCE_DIR}/include/PEM/kernel2") 
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) 
add_library(cfs ${files}) 

kernel2 еще один модуль и имеет свой собственный CMakeFile.

Теперь проблема заключается в том, что третий модуль: м3 требует заголовков от СХА (которые также требуют заголовков из kernel2)

Так я в основном иду с:

# Module: m3 
file(...) 
include_directories("${PROJECT_SOURCE_DIR}/include/PEM/cfs") 
add_library(m3 ${files}) 
target_link_library(m3 cfs) 

К сожалению, этого недостаточно, kernel2 включенные файлы не будут найдены при компиляции, если я не добавлю:

include_directories("${PROJECT_SOURCE_DIR}/include/PEM/kernel2") 

Я делаю это неправильно? Возможно, я также должен добавить файлы include, используя директиву add_library?

ответ

1

Если у вас есть #include директивы в заголовках CFS, то вы должны использовать

include_directories("${PROJECT_SOURCE_DIR}/include/PEM/kernel2") 

Это не проблема CMake, но как/C++ компилятор работает C.

Например, вы следующий заголовок в CFS:

#include "kernel2/someclass.h" 

class SomeCfsClass 
{ 
private: 
    SomeKernelClass kernelObject; 
} 

Теперь, если вы хотите создать экземпляр SomeCfsClass в модуле м3, компилятор должен знать его размер. Но зная, что размер невозможен без определения SomeKernelClass определения из kernel2/someclass.h.

Эта ситуация может быть решена за счет хранения не объект, а указатель на него внутри SomeCfsClass:

class SomeKernelClass; // forward declare SomeKernelClass 

class SomeCfsClass 
{ 
private: 
    SomeKernelClass * kernelObject; 
} 

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

В качестве альтернативы я могу предложить использовать относительные пути в директивах #include, но это решение несколько хакерское.

+0

Либо я объяснил это неправильно, либо неправильно. Но так как cfs компилирует и выводит файл библиотеки, нет ли способа сказать m3 использовать эту библиотеку, не включая заголовки ядра2? – Salepate

+0

Если заголовки cfs содержат заголовки ядра 2 - нет. Если вы хотите, я могу расширить ответ с объяснением, почему это так. – arrowd

+0

Если вы не возражаете, я бы хотел этого. – Salepate

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