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

132
22 апреля 2022, 15:40

У меня есть 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) 

То получаю ошибку еще на этапе генерации Makefile:

    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.

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

Answer 1

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

CMakeLists.txt:

cmake_minimum_required(VERSION 3.16)
project(some_project VERSION 1.0 LANGUAGES CXX)
# Инициализация параметров
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)
# Устанавливаем, какие заголовочные файлы должны поставляться вместе с библиотекой
set_target_properties(${PROJECT_NAME} PROPERTIES PUBLIC_HEADER "${HEADERS}")
# Устанавливаем библиотеку
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")
READ ALSO
Программа выдаёт ошибку

Программа выдаёт ошибку

Написал простейший алгоритм на с++, который находит сумму элементов массива, которые не равны максимальному, повторяющие максимальные элементы...

222
Получение значения ячейки TableView в делегате Qml

Получение значения ячейки TableView в делегате Qml

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

162
задача не проходит по времени

задача не проходит по времени

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

107
Как передать массив в функцию и вернуть его?

Как передать массив в функцию и вернуть его?

Я знаю что во всех почти других языка есть такой тип метода как int[] и я могу вернуть, массив который я передал

93