Я думаю, вы поступаете неправильно. Вам не нужно создавать assimp отдельно от вашего проекта, и вам не нужно make install
, чтобы сделать его доступным.
В Cmake есть несколько способов обработки сторонних зависимостей, поскольку вы уже выбрали субмодулирование хранилища assimp, и мы начнем с него. Предполагая, что assimp находится в корне вашего репозитория в каталоге с именем assimp/
, это будет простой проект, включая его:
cmake_minimum_required(VERSION 3.0)
project(Project myassimpproj)
# include your directories
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
)
# set any variables you might need to set for your app and assimp
set(BUILD_ASSIMP_TOOLS ON)
set(ASSIMP_BUILD_STATIC_LIB ON)
# add assimp source dir as a subdirectory, effectively making
# assimp's CMakeLists.txt part of your build
add_subdirectory(/path/to/assimp ${CMAKE_BINARY_DIR}/assimp)
add_executable(assimp_target main.cpp)
# be sure to link in assimp, use platform-agnostic syntax for the linker
target_link_libraries(assimp_target assimp)
Возможно, есть лучший способ сформулировать это, используя синтаксис выражений генератора, но я не смотрел на файл assake CMakeLists.txt, чтобы узнать, поддерживается ли он (и в любом случае это более общий способ).
Не каждый проект использует Cmake, поэтому вы не сможете просто add_subdirectory()
. В этих случаях вы можете эффективно «подделать» вызов пользователя, чтобы построить его, используя его команды сборки на соответствующих платформах. execute_process()
запускает команду во время настройки add_custom_command()
и add_custom_target()
запускает команды во время сборки. Затем вы создаете поддельную цель для интеграции и скрестите пальцы, когда-нибудь они поддержат Cmake.
Вы также можете использовать команды ExternalProject
, добавленные в Cmake, для создания пользовательской цели для загрузки, обновления / исправления, настройки, сборки, установки и тестирования шагов внешнего проекта, но обратите внимание, что это решение и следующая загрузка зависимости вместо использования исходного кода подмодуля.
Наконец, я предпочитаю работать с готовыми зависимостями, сокращая время сборки, и они могут быть протестированы модульно самостоятельно вне проекта. Conan - это децентрализованный и мультиплатформенный менеджер пакетов с открытым исходным кодом, с очень хорошей поддержкой C ++ и почти прозрачной поддержкой Cmake при правильном использовании. Они выросли очень стабильно в прошлом году. Больше информации о том, как использовать Conan с Cmake, можно найти здесь .