Установка динамической библиотеки с использованием cmake

#c #windows #cmake

#c #Windows #cmake

Вопрос:

У меня есть C /Qt библиотека, которую я написал сам. Я понимаю, что для ее распространения необходимо установить cmake . dll (или .so для Linux) файлы и файлы заголовков. Итак, я пишу следующее CMakeLists.txt :

 cmake_minimum_required(VERSION 3.16)
project(my_project)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

find_package(Qt5 COMPONENTS Core Network Sql REQUIRED)

set(HEADERS some_class.h)
set(SOURCES some_class.cpp)

add_library(${PROJECT_NAME} SHARED ${HEADERS} ${SOURCES})

target_link_libraries(${PROJECT_NAME} Qt5::Core Qt5::Network Qt5::Sql)

install(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION "lib"
                                RUNTIME DESTINATION "bin"
                                COMPONENT library)
install(FILES ${HEADERS} DESTINATION "include")
  

И я получаю файлы, которые должны быть в каталоге C:Program Files (x86)my_project :

 -- lib/libmy_project.dll.a
-- bin/libmy_project.dll
-- include/some_class.h
  

Однако, как только я пытаюсь объединить свою библиотеку с тестовой программой:

 find_package(my_project REQUIRED)
# ....
target_link_libraries(${PROJECT_NAME} my_project) 
  

У меня ошибка:

 By not providing "Findmy_project.cmake" in CMAKE_MODULE_PATH this
  project has asked CMake to find a package configuration file provided by
  "my_project", but CMake did not find one.

  Could not find a package configuration file provided by "my_project"
  with any of the following names:

    my_projectConfig.cmake
    my_project-config.cmake

  Add the installation prefix of "my_project" to CMAKE_PREFIX_PATH or
  set "my_project_DIR" to a directory containing one of the above
  files.  If "my_project" provides a separate development package or
  SDK, be sure it has been installed.
  

То есть он просто не понимает, где его искать. Как я понял, у CMake есть файл конфигурации для моего проекта, и CMakeLists.txt для моей библиотеки надо как-то его установить. Однако информацию в интернете на этот счет я нашел очень крутую, без пояснений и примеров (не там искал?). Тем не менее, как и где записывать эти файлы конфигурации для библиотек?

Комментарии:

1. Для установки есть опция «ЭКСПОРТ», которая может сгенерировать для вас такой файл конфигурации, см. cmake.org/cmake/help/v3.13/command /…

Ответ №1:

Я не получил окончательного понимания, но я понял, что написать, чтобы правильно экспортировать библиотеку.

CMakeLists.txt :

 cmake_minimum_required(VERSION 3.16)
project(some_project VERSION 1.0 LANGUAGES CXX)

# Parameters initialization
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

# Search for required libraries
find_package(Qt5 COMPONENTS Core Network Sql REQUIRED)

# Project files
set(HEADERS some_class.h)
set(SOURCES some_class.cpp)

# Building the library
add_library(${PROJECT_NAME} SHARED ${HEADERS} ${SOURCES})

# Linking the necessary libraries
target_link_libraries(${PROJECT_NAME} Qt5::Core Qt5::Network Qt5::Sql)

# Setting which header files should be supplied with the library
set_target_properties(${PROJECT_NAME} PROPERTIES PUBLIC_HEADER "${HEADERS}")

# Installing the library
install(TARGETS ${PROJECT_NAME}
        EXPORT "${PROJECT_NAME}-config"
        RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
        LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}"
        ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}"
        PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}"
        PRIVATE_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}"
        INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}")

install(EXPORT "${PROJECT_NAME}-config" DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")

export(TARGETS ${PROJECT_NAME} FILE "${PROJECT_NAME}-exports.cmake")