Cmakelists
时间: 2025-02-09 11:05:07 浏览: 42
### 配置 `CMakeLists.txt` 文件
#### 基本结构和语法
一个典型的 `CMakeLists.txt` 文件通常由多个部分组成,这些部分定义了项目的元数据、依赖关系以及构建规则。以下是创建简单 C++ 应用程序所需的最小化配置:
```cmake
# 设置最低版本需求
cmake_minimum_required(VERSION 3.10)
# 定义项目名称及其支持的语言
project(MyProject VERSION 1.0 LANGUAGES CXX)[^1]
# 查找并链接必要的包/库
find_package(PkgConfig REQUIRED)
pkg_check_modules(PC_LIBFOO REQUIRED libfoo>=1.2)[^2]
# 添加源文件目录
add_subdirectory(src)
# 创建可执行文件或共享库
if(BUILD_SHARED_LIBS)
add_library(hello SHARED src/hello.cpp)
else()
add_executable(myapp main.cpp)
endif()
```
对于希望生成动态链接库的情况,则需特别注意设置 `BUILD_SHARED_LIBS` 变量来控制最终产物的形式。
#### 动态库生成实例
当目标是生产 `.so`(Linux) 或者 `.dll`(Windows) 形式的共享对象时,在上述基础上进一步指定输出路径和其他属性即可完成整个流程:
```cmake
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
configure_file(
"${PROJECT_SOURCE_DIR}/hello.h"
"${PROJECT_BINARY_DIR}/include/hello.h"
COPYONLY
)
install(TARGETS hello DESTINATION lib)
install(FILES "${PROJECT_BINARY_DIR}/include/hello.h" DESTINATION include)
```
这段脚本不仅指定了二进制文件的目标位置,还处理了头文件安装事宜,使得第三方开发者能够方便地集成该库到自己的工程当中去。
#### 复杂场景下的应用案例
考虑到实际开发过程中可能涉及到更多复杂的组件组合,比如结合 PCL (Point Cloud Library), OpenCV 和 Ceres Solver 进行点云图像处理的应用场合下,相应的 `CMakeLists.txt` 将会更加复杂一些[^4]:
```cmake
find_package(PCL 1.8 REQUIRED COMPONENTS common io visualization)
find_package(OpenCV REQUIRED)
find_package(Ceres REQUIRED)
include_directories(${PCL_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
add_executable(pcl_example example.cpp)
target_link_libraries(pcl_example ${PCL_LIBRARIES} ${OpenCV_LIBS} ceres::ceres)
```
此片段展示了如何定位外部资源的位置,并将其正确关联至当前正在构建的对象之上;同时通过宏定义传递特定于平台的信息给编译器。
阅读全文
相关推荐


















