使用cmake安装动态库



我有自己编写的C++/Qt库。我知道,对于它的分发,cmake必须安装。dll(或适用于Linux的.so(文件和头文件。所以我写了以下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应该以某种方式安装它。然而,我发现这个帐户上的互联网信息非常陡峭,没有解释和示例(没有寻求?(。不过,如何以及在哪里为库编写这些配置文件?

我没有得到最终的理解,但我想好了要写什么才能正确导出库。

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")

最新更新