2013-05-23 3 views
0

Я следующую структуру для проекта, я работаю над:CMake - в зависимости от другого Cmake проекта

---Library1 
------build 
------include 
------src 
------CMakeLists.txt 
---Library2 
------build 
------include 
------src 
------CMakeLists.txt 
---Executable1 
------build 
------include 
------src 
------CMakeLists.txt 

Library1 библиотека Я разрабатываю, что необходимо связать с Library2, который является 3-й библиотеки партии. Когда я создаю Library1, мне нужно его автоматически построить Library2 и связать с ним. Executable1 необходимо будет построить и связать с Library1. Я не знаю, как это сделать с Cmake, и мне было интересно, может ли кто-нибудь привести меня в правильном направлении. Я думаю, мне, возможно, придется использовать команду add_dependencies или add_subdirectory, но я не уверен, как их использовать и убедиться, что они связаны с моей библиотекой. Любая помощь будет оценена по достоинству.

ответ

1

Я думаю, что лучшие команды здесь, вероятно, будут add_subdirectory (как вы подозревали) и target_link_libraries.

Я предполагаю, что с вашей структурой каталогов я ожидаю увидеть «top-level» CMakeLists.txt в корне. В этом файле CMake вы будете ссылаться на CMakeLists подкаталогов, используя add_subdirectory.

Я представляю, как Library1 и Library2 фактические цели CMake, включенные через add_library, а так же у вас есть add_executable(Executable1 ...). В этом случае, вы можете добавить следующее Library1/CMakeLists.txt:

target_link_libraries(Library1 Library2) 

CMake теперь автоматически связывает Library2 когда Library1 определяется как зависимость. Если Library2 изменен, то он будет автоматически восстановлен до того, как снова будет связан с Library1.

Аналогично в Executable1/CMakeLists.txt вы можете сделать:

target_link_libraries(Executable1 Library1) 

Пожалуй, единственное, чтобы наблюдать за здесь является то, что порядок add_subdirectory команды должны были бы быть

add_subdirectory(Library2) 
add_subdirectory(Library1) 
add_subdirectory(Executable1) 

так что зависимости определены до, на которые они ссылаются в вызовах target_link_libraries.

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

+0

В случае с Брэдом у меня были бы «Исполняемые/build/linux» и «Executable/build/win32'. все библиотеки были построены внутри 'Executable/build/XXX'. – GameDeveloper

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