Как включить библиотеку с использованием CMAKE в кроссплатформенном виде - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь использовать библиотеку assimp в кроссплатформенном проекте C ++. Я включил репозиторий в подмодуль git, поэтому, если кто-то загрузит мой проект, он также загрузит проект ASSIMP.

После того, как я пройду инструкции сборки assimp / CMAKE и (в Linux) введите make install, и с тех пор в моем проекте я могу использовать:

target_link_libraries(${PROJECT_NAME} assimp)

Однако в Windows нет make install.

Единственный способ включить библиотеку в Linux - это добавить (в моем файле CmakeLists.txt):

target_link_libraries(${PROJECT_NAME} ${CMAKE_SOURCE_DIR}/build/assimp/code/libassimp.so)

Это не кроссплатформенный код, поскольку он жестко кодирует имя и местоположение файла .so, который не будет работать в Windows.

Как мне выставить библиотеку, чтобы я мог сделать что-то вроде target_link_libraries(${PROJECT_NAME} assimp) на всех платформах?

Мое дерево каталогов выглядит так:

- src
- include
    - assimp
- bin

Где каталог assimp в каталоге include является подмодулем git

1 Ответ

0 голосов
/ 05 января 2019

Я думаю, вы поступаете неправильно. Вам не нужно создавать 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, можно найти здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...