CMake, как правильно создавать зависимости между целями
Я пытаюсь использовать CMake для настройки некоторых простых зависимостей между проектом С++ и библиотеками, которые он использует.
Настройка выполняется следующим образом
Сам проект содержит исходные файлы, содержащие заголовки Dependency, и когда исполняемый файл построен, он должен быть связан с статической библиотекой Dependency.
До сих пор я могу заставить это работать, но я должен указать каталоги include Dependency в файле CMakeLists для Project вручную. Я хочу, чтобы это было вытащено автоматически, и я изучил возможность использования команды find_package(), чтобы сделать это с ограниченным успехом и сделать вещи намного сложнее.
Все, что я хочу сделать, это иметь зависимость, созданная до проекта, и иметь ссылку Project против библиотеки и иметь свои каталоги include. Есть ли простой краткий способ достижения этого?
Мои текущие файлы cmake:
ПРОЕКТ, CMakeLists.txt:
cmake_minimum_required (VERSION 2.6)
project (Project)
include_directories ("${PROJECT_SOURCE_DIR}/Project")
add_subdirectory (Dependency)
add_executable (Project main.cpp)
target_link_libraries (Project Dependency)
add_dependencies(Project Dependency)
DEPENDENCY, CMakeLists.txt
project(Dependency)
add_library(Dependency SomethingToCompile.cpp)
target_link_libraries(Dependency)
Ответы
Ответ 1
Так как CMake 2.8.11
вы можете использовать target_include_directories
. Просто добавьте в проект DEPENDENCY эту функцию и заполните включенные каталоги, которые вы хотите увидеть в главном проекте. CMake позаботится обо всем остальном.
ПРОЕКТ, CMakeLists.txt:
cmake_minimum_required (VERSION 2.8.11)
project (Project)
include_directories (Project)
add_subdirectory (Dependency)
add_executable (Project main.cpp)
target_link_libraries (Project Dependency)
DEPENDENCY, CMakeLists.txt
project (Dependency)
add_library (Dependency SomethingToCompile.cpp)
target_include_directories (Dependency PUBLIC include)
Ответ 2
Не совсем понятно, что вы хотите сделать, и почему Project и Depency необходимо создавать отдельно.
Мой первый, хотя на вашем примере будет
-
В ПРОЕКТЕ, CMakeLists.txt
- Удалить add_dependencies (зависимость от проекта)
Нет необходимости указывать зависимость, target_link_libraries() уже делает это.
-
В DEPENDENCY, CMakeLists.txt
- Удалить проект (зависимость)
Он создает библиотеку, поэтому зачем иметь собственный проект?
- Удалить target_link_libraries (Dependency)
Потому что ничего не делает