2017-02-19 2 views
2

TL; DRCMake добавить библиотеку с подкаталогами

Использование CMake, как я могу включать подкаталоги в библиотеку таким образом, что они могут быть включены без ссылки на каталоги, они постоянно находятся?

End TL; DR

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

ParentDir 
--src 
----source.cpp 
----source.h 
----entities_dir 
------entity.cpp 
------entity.h 
------CMakeLists.txt 
----CMakeLists.txt 
--CMakeLists.txt 
--main.cpp 

как он в настоящее время стоит, у меня есть библиотека, определенная CMakeLists в каталоге src. Таким образом, я могу включить src-файлы в основном с помощью #include, как показано в #include "src/file.h". Я хотел бы иметь возможность делать то же самое для своих заголовков, которые существуют в подкаталогах src.

CMakeLists.txt

cmake_minimum_required(VERSION 3.6) 
project(Project) 

add_executable(Project ${SOURCE_FILES} main.cpp) 
include_directories(src) 
add_subdirectory(src) 
target_link_libraries(Project Library) # Engine Libraries 

SRC/CMakeLists.txt

file(GLOB SOURCE_FILES *.cpp) 
file(GLOB HEADER_FILES *.h) 

add_library(Library STATIC ${SOURCE_FILES} ${HEADER_FILES}) 

main.cpp

#include <source.h> // this works 
#include <entity.h> // this does not work but I want it to 
#include <entities/entity.h> // this works but I don't want this 
int main() {} 

Я п Конечно, как это сделать. Я пытался использовать GLOB_RECURSE, add_subdirectory (сущности) и т. Д. Я также попытался создать библиотеку под названием Entities внутри src/entities/CMakeLists.txt и связать ее с link_libraries. Ни один из них не был успешным. Каков правильный способ добиться этого, потому что я думаю, что, вероятно, я совершенно не согласен с этим.

+3

Вам нужен этот путь в пути поиска заголовков компиляторов, который достигается с помощью вызова include_directories(). Вы можете изменить существующий вызов include_directories (src) для include_directories (src src/entities). Я не знаю, как сделать это рекурсивным, и я бы не рекомендовал его. – qexyn

+0

, так что работает. Кажется, мне сложно понять, как вы должны использовать cmake. Я видел, что это обычное явление, когда в каждом каталоге есть cmakelists. Поскольку в этом случае skc cmakelists создает фактическую библиотеку, не должен ли родительский cmake только ссылаться на src cmake и не нуждаться в знаниях поддиректоров src? – tramstheman

+0

@qexyn, если вы хотите оставить ответ, я приму его. – tramstheman

ответ

1

Вам нужен этот путь в пути поиска заголовков компиляторов, который достигается с помощью вызова include_directories(). Вы можете изменить существующие include_directories (SRC) призывают быть:

include_directories(src src/entities) 

Кроме того, этот SO пост связан и стоит читать: Recursive CMake search for header and source files. Там есть отрывок из самого сайта CMake, рекомендующего против использования файла (GLOB ...), который дает рекомендации относительно рекурсивных решений в целом.Как тяжелый пользователь CMake, я согласен с аргументами, сделанными против него.

0

Вам просто нужно добавить:

include_directories(${CMAKE_CURRENT_LIST_DIR}) 

В каждом CMakeLists.txt в вашей иерархии.

CMake сам по себе не компилирует ваш проект, он только называет вашу инструментальную цепочку и передает ей параметры, а ваша инструментальная цепочка не «знает», что она вызывается CMake или структурой вашего проекта. Таким образом, вам нужно указать toolchain, где можно найти файлы include.

Хотя в каждом подкаталоге обычно присутствует CMakeLists.txt, это отнюдь не требование. CMakeLists.txt в вашем каталоге src может содержать все инструкции, необходимые для создания сборки. Как правило, CMakeLists.txt помещается на каждый уровень, чтобы упростить управление структурой, например. каждый каталог должен знать только, что ему нужно делать (предположительно, с файлами в этом каталоге).

+0

Это, к сожалению, не сработало. Следуя рекомендациям комментария, я добавил «include_directories (src/entities)», который работал, однако я действительно ищу ответ, в котором я могу просто «include_directories (src)» и CMakeLists.txt в дескрипторах каталога src все подкаталоги. – tramstheman