Cmake - экспорт и импорт библиотек - PullRequest
0 голосов
/ 22 октября 2018

CMake экспорт / импорт библиотек

Я хочу экспортировать и импортировать библиотеки в cmake переносимым способом (windows AND linux).Я хочу сделать это правильно, чисто, с помощью команд install target и export, однако они довольно загадочны, а документация - хотя и полная - не дает абсолютно никакого контекста или простого примера для изучения.В настоящее время у меня есть cmakelists из libA:

cmake_minimum_required(VERSION 3.5)
project(libA VERSION 0.1.0 LANGUAGES C)
# Files
set(PUBLIC_HEADERS
    includes/libA.h
)
set(SOURCE_FILES
    sources/libA.c
)
# Shared library
add_library(libA SHARED 
  ${SOURCE_FILES}
)
set_target_properties(libA PROPERTIES
    PUBLIC_HEADER "${PUBLIC_HEADERS}"
)
# Include paths
target_include_directories(libA
    PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/includes>
)
# Link
target_link_libraries(libA)
# Packaging
# Install target to export
set(CMAKE_INSTALL_PREFIX "$ENV{CMAKE_REPO}/libA")
install(TARGETS libA
    EXPORT libA-export
    LIBRARY DESTINATION "${CMAKE_INSTALL_PREFIX}/bin"
    ARCHIVE DESTINATION "${CMAKE_INSTALL_PREFIX}/bin"
    RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}/bin"
    PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_PREFIX}/include"
)
# Install export
install(EXPORT libA-export
    FILE libATargets.cmake
    CONFIGURATIONS Debug|Release
    DESTINATION ${CMAKE_INSTALL_PREFIX}/cmake
)
# Install config file
install(FILES libAConfig.cmake
    CONFIGURATIONS Debug|Release
    DESTINATION ${CMAKE_INSTALL_PREFIX}/cmake
)

Содержимое конфигурационного файла:

get_filename_component(libA_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
include(CMakeFindDependencyMacro)

if(NOT TARGET libA)
    include("${libA_CMAKE_DIR}/libATargets.cmake")
endif()

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

В моей второй lib (libB) я хочу импортировать libA:

cmake_minimum_required(VERSION 3.5)
project(libB VERSION 0.1.0 LANGUAGES C)
# Required packages
find_package(libA)
# Files
set(PUBLIC_HEADERS
    includes/libB.h
)
set(SOURCE_FILES
    sources/libB.c
)
# Shared library
add_library(libB SHARED
    ${SOURCE_FILES}
)
set_target_properties(libB PROPERTIES
    PUBLIC_HEADER "${PUBLIC_HEADERS}"
    INTERFACE_LINK_LIBRARIES "libA"
)
# Include paths
target_include_directories(libB
    PUBLIC
        $<INSTALL_INTERFACE:include>
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/includes>
)
# Link
target_link_libraries(libB
    PUBLIC libA
)

В настоящее время это дает ошибку в ссылке на libB: LNK1181 не может открыть входной файл 'libA-NOTFOUND.obj'

Как сделать эту ссылку?(и найдите правильный файл lib / so)?

Правильный ли я путь для экспорта / импорта?

Чего мне не хватает?

Пожалуйста, дайте немногоконтекст и / или некоторые объяснения, чтобы я мог понять, что я делаю; -)

1 Ответ

0 голосов
/ 22 октября 2018

Следуя комментариям @ Цыварева, я исправил следующее:

CONFIGURATIONS Debug|Release
-->
CONFIGURATIONS Debug Release

set_target_properties(libB PROPERTIES
    PUBLIC_HEADER "${PUBLIC_HEADERS}"
    INTERFACE_LINK_LIBRARIES "libA"
)
-->
set_target_properties(libB PROPERTIES
    PUBLIC_HEADER "${PUBLIC_HEADERS}"
)

find_package(libA)
-->
find_package(libA REQUIRED)

Я все почистил, очистил кеш и все заработало!Больше нет проблем с ссылками в libB.Большое спасибо Цыварев!

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