使用cmake生成target.cmake文件以供其他cmake文件find_package(),其中引用的库文件和头文件路径,能够根据install位置自行生成,举个详细的例子
时间: 2024-02-02 18:06:37 浏览: 74
windows下Qt6 使用CMake 安装时自动拷贝Qt及其他依赖文件
好的,我来举个例子。
假设我们有一个名为"MyLib"的C++库,其中包含一个名为 "mylib" 的静态库和一个名为 "mylib_shared" 的动态库。我们想要使用CMake生成一个"MyLibConfig.cmake"文件,以便其他CMake项目可以使用"find_package()"命令找到和使用"MyLib"库。
首先,我们需要在"MyLib/CMakeLists.txt"文件中添加以下代码:
```cmake
# 声明该项目的名称和版本号
project(MyLib VERSION 1.0)
# 添加库代码文件到该库
add_library(mylib STATIC mylib.cpp)
add_library(mylib_shared SHARED mylib.cpp)
# 指定install路径,以便于其他项目找到该库
install(TARGETS mylib mylib_shared
EXPORT MyLibConfig
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin)
install(FILES mylib.h DESTINATION include)
# 生成MyLibConfig.cmake文件
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/MyLibConfigVersion.cmake"
VERSION ${MyLib_VERSION}
COMPATIBILITY AnyNewerVersion
)
configure_package_config_file(
"${CMAKE_CURRENT_SOURCE_DIR}/MyLibConfig.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/MyLibConfig.cmake"
INSTALL_DESTINATION cmake
)
install(
FILES
"${CMAKE_CURRENT_BINARY_DIR}/MyLibConfig.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/MyLibConfigVersion.cmake"
DESTINATION cmake
)
```
在上述代码中,我们使用了"install()"命令将库和头文件安装到预定的目录。然后,我们使用"write_basic_package_version_file()"和"configure_package_config_file()"函数生成"MyLibConfig.cmake"文件。最后,我们使用"install()"命令将"MyLibConfig.cmake"文件和"MyLibConfigVersion.cmake"文件安装到预定的目录。
接下来,我们需要在"MyLibConfig.cmake.in"文件中添加以下代码:
```cmake
# 指定该项目的名称和版本号
set(MyLib_VERSION @MyLib_VERSION@)
set(MyLib_INCLUDE_DIRS "@CMAKE_INSTALL_PREFIX@/include")
set(MyLib_LIBRARIES "@CMAKE_INSTALL_PREFIX@/lib/libmylib.a")
set(MyLib_LIBRARIES_SHARED "@CMAKE_INSTALL_PREFIX@/lib/libmylib_shared.so")
# 导入MyLib的目标
include("${CMAKE_CURRENT_LIST_DIR}/MyLibTargets.cmake")
```
在上述代码中,我们使用了一些变量和CMake命令进行编写。这些变量和命令将在生成"MyLibConfig.cmake"文件时进行替换。
最后,我们需要在"MyLibTargets.cmake"文件中添加以下代码:
```cmake
# 导入mylib静态库
add_library(MyLib::mylib STATIC IMPORTED)
set_target_properties(MyLib::mylib PROPERTIES
IMPORTED_LOCATION "@CMAKE_INSTALL_PREFIX@/lib/libmylib.a"
)
# 导入mylib_shared动态库
add_library(MyLib::mylib_shared SHARED IMPORTED)
set_target_properties(MyLib::mylib_shared PROPERTIES
IMPORTED_LOCATION "@CMAKE_INSTALL_PREFIX@/lib/libmylib_shared.so"
)
# 导出MyLib的目标
install(
EXPORT MyLibConfig
NAMESPACE MyLib::
DESTINATION cmake
)
```
在上述代码中,我们使用了"add_library()"命令导入"MyLib"库中的静态库和动态库。然后,我们使用"install()"命令将"MyLibConfig"目标导出到"MyLibTargets.cmake"文件中,以便其他项目可以使用"find_package()"命令找到"MyLib"库。
完成上述步骤之后,我们可以使用以下命令生成"MyLibConfig.cmake"文件:
```bash
mkdir build && cd build
cmake ..
cmake --build .
cmake --install .
```
生成的"MyLibConfig.cmake"文件应该如下所示:
```cmake
# 指定该项目的名称和版本号
set(MyLib_VERSION 1.0)
set(MyLib_INCLUDE_DIRS "/usr/local/include")
set(MyLib_LIBRARIES "/usr/local/lib/libmylib.a")
set(MyLib_LIBRARIES_SHARED "/usr/local/lib/libmylib_shared.so")
# 导入MyLib的目标
include("/usr/local/lib/cmake/MyLib/MyLibTargets.cmake")
```
其他项目可以使用以下代码找到和使用"MyLib"库:
```cmake
# 找到MyLibConfig.cmake文件
find_package(MyLib REQUIRED)
# 包含MyLib头文件
include_directories(${MyLib_INCLUDE_DIRS})
# 链接MyLib库
target_link_libraries(my_target MyLib::mylib)
```
希望这个例子能够帮助你理解如何使用CMake生成"target.cmake"文件以供其他CMake项目使用。
阅读全文