CMakeList.txt模板与 Visual Studio IDE 操作对比表

CMakeList.txt模板与 Visual Studio IDE 操作对比表

    • [1. CMakeList.txt模板](#1. CMakeList.txt模板)
    • [2. 项目构建方法](#2. 项目构建方法)
    • [3. CMake 与 Visual Studio IDE 操作对比表](#3. CMake 与 Visual Studio IDE 操作对比表)

1. CMakeList.txt模板

bash 复制代码
# ============================================================================
# 1.项目基本信息
# ============================================================================
catkin_minimum_required(VERSION 3.15)
project(ImageProcessor)

# ============================================================================
# 2.C++ 标准设置
# ============================================================================
set(CMAKE_CXX_STANDARD 17)

# ============================================================================
# 3.构建类型和编译选项
# ============================================================================
if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
endif()

# ============================================================================
# 4.查找依赖库
# ============================================================================
# Eigen3
find_package(Eigen3 REQUIRED)
if(Eigen3_FOUND)
    message(STATUS "Found Eigen3 version: ${EIGEN3_VERSION}")
endif()

# ============================================================================
# 5.包含目录
# ============================================================================
include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}/include
    ${CMAKE_CURRENT_SOURCE_DIR}/src
    ${EIGEN3_INCLUDE_DIRS}
)

# ============================================================================
# 6.创建静态库目标
# ============================================================================
add_library(ImageProcessorLib STATIC
    ${CORE_SOURCES}
    ${CORE_HEADERS}
    ${UTILS_SOURCES}
    ${UTILS_HEADERS}
)

# 为库目标设置包含目录(更现代的方式)
target_include_directories(ImageProcessorLib PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:include>
)

# 为库目标链接依赖
target_link_libraries(ImageProcessorLib PUBLIC
    ${OpenCV_LIBRARIES}
    
# ============================================================================
# 7.创建动态库
# ============================================================================
add_library(ImageProcessorShared SHARED
    ${CORE_SOURCES}
    ${UTILS_SOURCES}
    )

target_include_directories(ImageProcessorShared PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:include>
    )

target_link_libraries(ImageProcessorShared PUBLIC
    ${OpenCV_LIBRARIES}
    Eigen3::Eigen
    )
    
# ============================================================================
# 8.创建可执行文件目标
# ============================================================================
add_executable(ImageProcessorApp
    src/main.cpp
)

# 链接库到可执行文件
target_link_libraries(ImageProcessorApp PRIVATE
    ImageProcessorLib
)

# ============================================================================
# 9.安装规则
# ============================================================================
install(TARGETS ImageProcessorLib ImageProcessorApp
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib
)

install(DIRECTORY include/
    DESTINATION include
    FILES_MATCHING PATTERN "*.h"
)

# 安装配置文件
install(FILES config/default_config.json
    DESTINATION config
)

# ============================================================================
# 10.输出配置信息
# ============================================================================
message(STATUS "==============================================")
message(STATUS "Project: ${PROJECT_NAME} ${PROJECT_VERSION}")
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}")
message(STATUS "Compiler: ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}")
message(STATUS "Build tests: ${BUILD_TESTS}")
message(STATUS "Build shared libs: ${BUILD_SHARED_LIBS}")
message(STATUS "Output directory: ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
message(STATUS "==============================================")

2. 项目构建方法

  1. 创建构建目录:在项目根目录下执行mkdir build && cd build命令,实现源码与构建文件的物理隔离。

  2. 配置项目:进入build目录执行cmake ..(...指向源码目录),自动生成平台特定构建文件。

  3. 执行构建:

    Unix/Linux:直接运行make命令

    Windows平台:使用Visual Studio打开生成的.sln解决方案,或执行cmake --build .

  4. 运行验证:构建完成后,在对应目录查找生成的可执行文件进行测试。

3. CMake 与 Visual Studio IDE 操作对比表

CMake 命令 Visual Studio IDE 操作 说明
项目和目标
project(MyProject) 解决方案资源管理器中的项目名称 设置项目名称
add_executable(target src.cpp) 添加源文件 + 配置类型选择"应用程序(.exe)" 创建可执行文件
add_library(mylib STATIC src.cpp) 配置类型 → "静态库(.lib)" 创建静态库
add_library(mylib SHARED src.cpp) 配置类型 → "动态库(.dll)" 创建动态链接库
包含和链接
include_directories(path) C/C++ → 常规 → 附加包含目录 添加头文件搜索路径
target_include_directories(target ...) 同上,但针对特定目标 更现代的写法
link_directories(path) 链接器 → 常规 → 附加库目录 添加库文件搜索路径
target_link_libraries(target lib) 链接器 → 输入 → 附加依赖项 链接库文件
编译选项
set(CMAKE_CXX_STANDARD 17) C/C++ → 语言 → C++ 语言标准 → ISO C++17 设置 C++ 标准
target_compile_options(target /W4) C/C++ → 常规 → 警告等级 编译器警告级别
target_compile_definitions(target -DDEBUG) C/C++ → 预处理器 → 预处理器定义 添加宏定义
set(CMAKE_CXX_FLAGS "/O2") C/C++ → 优化 → 优化级别 编译器优化选项
输出配置
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${dir}) 常规 → 输出目录 可执行文件输出路径
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${dir}) 常规 → 输出目录 动态库输出路径
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${dir}) 链接器 → 常规 → 输出文件 静态库输出路径
set_target_properties(target PROPERTIES OUTPUT_NAME "name") 链接器 → 常规 → 输出文件名 自定义输出文件名
配置类型
set(CMAKE_BUILD_TYPE Release) 工具栏配置下拉框 → Release Release 配置
set(CMAKE_BUILD_TYPE Debug) 工具栏配置下拉框 → Debug Debug 配置
set(CMAKE_CONFIGURATION_TYPES "Debug;Release") 配置管理器 → 添加/删除配置 多配置支持
条件编译
if(WIN32) ... endif() 配置属性 → 生成事件 → 条件 平台特定设置
$<$<CONFIG:Debug>:flags> Debug/Release 配置分别设置 配置相关选项
高级选项
add_subdirectory(subdir) 解决方案中添加新项目/子项目 添加子目录项目
add_dependencies(target dep) 项目依赖项设置 设置项目依赖关系
set_target_properties(target PROPERTIES FOLDER "group") 解决方案资源管理器中的筛选器 项目分组
install(TARGETS target DESTINATION bin) 无直接对应,需手动复制 安装规则
源文件组织
file(GLOB SOURCES "src/*.cpp") 手动添加所有 .cpp 文件到项目 批量添加源文件
其他常用
option(BUILD_SHARED_LIBS "Build shared" ON) 配置管理器中自定义配置 构建选项开关
add_compile_options(/utf-8) C/C++ → 命令行 → 其他选项 额外编译选项
相关推荐
寻寻觅觅☆5 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
fpcc5 小时前
并行编程实战——CUDA编程的Parallel Task类型
c++·cuda
ceclar1236 小时前
C++使用format
开发语言·c++·算法
lanhuazui107 小时前
C++ 中什么时候用::(作用域解析运算符)
c++
charlee447 小时前
从零实现一个生产级 RAG 语义搜索系统:C++ + ONNX + FAISS 实战
c++·faiss·onnx·rag·语义搜索
老约家的可汗7 小时前
初识C++
开发语言·c++
crescent_悦7 小时前
C++:Product of Polynomials
开发语言·c++
乐观勇敢坚强的老彭8 小时前
c++寒假营day03
java·开发语言·c++
愚者游世9 小时前
brace-or-equal initializers(花括号或等号初始化器)各版本异同
开发语言·c++·程序人生·面试·visual studio