cmake如何自定义项目,并可以被其他cmake文件find_package
时间: 2023-11-08 17:10:08 浏览: 93
要自定义一个CMake项目并让其他CMake文件可以使用 `find_package` 命令引用该项目,可以按照以下步骤:
1. 在项目根目录下创建一个 `cmake` 目录,将项目的 CMake 配置文件放在该目录下,命名为 `ProjectConfig.cmake.in`。
2. 在 `ProjectConfig.cmake.in` 文件中,使用 `set()` 命令定义项目的相关变量,如项目名称、版本号、安装路径等。例如:
```cmake
set(PROJECT_NAME MyProject)
set(PROJECT_VERSION 1.0.0)
set(PROJECT_INSTALL_DIR ${CMAKE_INSTALL_PREFIX})
```
3. 在 `ProjectConfig.cmake.in` 文件中,使用 `configure_file()` 命令生成 `ProjectConfig.cmake` 文件。例如:
```cmake
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/ProjectConfig.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/ProjectConfig.cmake
@ONLY
)
```
`configure_file()` 命令会将 `ProjectConfig.cmake.in` 文件中的变量替换为具体的值,并生成 `ProjectConfig.cmake` 文件。其中,`@ONLY` 参数表示只替换 `@` 开头的变量,其他变量不进行替换。
4. 在项目根目录下的 `CMakeLists.txt` 文件中,通过 `install()` 命令安装生成的 `ProjectConfig.cmake` 文件。例如:
```cmake
install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/ProjectConfig.cmake
DESTINATION lib/cmake/${PROJECT_NAME}
)
```
`install()` 命令将 `ProjectConfig.cmake` 文件安装到 `${CMAKE_INSTALL_PREFIX}/lib/cmake/${PROJECT_NAME}` 目录下,`${PROJECT_NAME}` 为项目名称。
5. 在 `CMakeLists.txt` 文件中,通过 `add_library()` 或 `add_executable()` 命令定义项目的库或可执行文件,并在 `CMakeLists.txt` 文件末尾添加 `export(TARGETS ...)` 命令,将需要被其他项目引用的库或可执行文件导出。例如:
```cmake
add_library(MyLibrary SHARED ${SOURCE_FILES})
...
export(TARGETS MyLibrary FILE MyLibraryTargets.cmake)
```
`export()` 命令将 `MyLibrary` 库导出到 `MyLibraryTargets.cmake` 文件中。
6. 在 `CMakeLists.txt` 文件中,通过 `install()` 命令安装项目的头文件、库文件和可执行文件。例如:
```cmake
install(
TARGETS MyLibrary
EXPORT MyLibraryTargets
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
INCLUDES DESTINATION include
)
install(
DIRECTORY include/
DESTINATION include
)
```
`install()` 命令将 `MyLibrary` 库安装到 `${CMAKE_INSTALL_PREFIX}/lib` 目录下,头文件安装到 `${CMAKE_INSTALL_PREFIX}/include` 目录下。
7. 在其他项目的 `CMakeLists.txt` 文件中,通过 `find_package()` 命令引用自定义的项目。例如:
```cmake
find_package(MyProject 1.0.0 REQUIRED)
target_link_libraries(MyApp PRIVATE MyProject::MyLibrary)
```
`find_package()` 命令会查找 `${CMAKE_INSTALL_PREFIX}/lib/cmake/MyProject/MyProjectConfig.cmake` 文件,并将其中定义的变量导入到当前项目中。在这个例子中,`MyProjectConfig.cmake` 文件会定义 `MyLibrary` 目标的链接库 `${MyLibrary_LIBRARIES}`,可以通过 `MyProject::MyLibrary` 别名来引用该库。
阅读全文