c++ cmake

demo1:

cmake_minimum_required(VERSION 3.10)

#定义工程名字
project(projectName)

#定义工程会生成一个可执行程序
add_executable(可执行程序名  源文件名)

#执行CMake命令
$ cmake CMakeLists.txt文件所在的路径
#执行make命令
$ make
-----------------------------------

demo2:
cmake_minimum_required(VERSION 3.10)
project(project1)

#bin目录下存最后生成的可执行文件
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIE}/bin)

#将源码文件.cpp的目录保存在SRC_LIST变量中,注:源码在src文件夹中
aux_source_directory(src  SRC_LIST)

#指定头文件路径
include_directories(include)

#定义工程生成一个可执行程序
add_executable(main  ${SRC_LIST})

--------------------------------------------------------------------------11----------------------------------

# 指定cmake的最低版本
cmake_minimum_required(VERSION 3.26.0)

# 设置项目名称,之后生成的可执行文件或者动态库都是用这个名字,便于修改
# PROJECT_NAME 是全局的工程名
set(PROJECT_NAME "BNE")
# set(LIBRARY_OUTPUT_NAME "BNE")

# 设置整合工程的名字 版本以及一些描述信息
project(${PROJECT_NAME}
        VERSION 0.1.0
        DESCRIPTION "BNE"
        LANGUAGES C CXX
        )
# 编译器配置
## ------------------------------------------ ----------------------------------------------------------------------##

# 设置全局默认值构建动态库
# ON add_library() 默认是生成动态库
# OFF 默认是生成静态库
set(BUILD_SHARED_LIBS ON)

# https://zhuanlan.zhihu.com/p/500002865
# 使用 C++17
set(CMAKE_CXX_STANDARD 17)
# 强制最低的标准为 C++17
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 尝试使用C++扩展 特定编译器特定的语言功能和特性
set(CMAKE_CXX_EXTENSIONS ON)
# 指定C编译器路径
# set (CMAKE_C_COMPILER             "/usr/bin/gcc") # 填写绝对路径
# 设置编译标志
# 使用 C++17
set (CMAKE_C_FLAGS                "-std=c++17")
# 设置在Debug模式时, 编译标志
# -Wall 启用所有警告
# -Wextra 启用所有的额外警告
# -Wno-unused-parameter 忽略未使用参数的警告
# -O1 -O2 -O3 -Os 不同的优化等级
# -gggdb gdb调试
set (CMAKE_C_FLAGS_DEBUG          "-g -Wall -Wextra -Wno-unused-parameter -copy-dt-needed-entries")
# MINSIZEREL版本 生产环境优化代码 便于生产环境有调式信息,便于调试
set (CMAKE_C_FLAGS_MINSIZEREL     "-Os -g -Wall -Wextra")
# Release版本 通过设置 CMAKE_BUILD_TYPE来指定
set (CMAKE_C_FLAGS_RELEASE        "-O4 -DNDEBUG")
# 生成带有调试信息的Release版本
set (CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g")

# 同上
# set (CMAKE_CXX_COMPILER             "/usr/bin/g++") # 填写绝对路径
set (CMAKE_CXX_FLAGS                "-std=c++17")
set (CMAKE_CXX_FLAGS_DEBUG          "-g -Wall -Wextra -Wno-unused-parameter")
set (CMAKE_CXX_FLAGS_MINSIZEREL     "-Os -g -Wall -Wextra")
set (CMAKE_CXX_FLAGS_RELEASE        "-O4 -DNDEBUG")
set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")

# 设置输出文件目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/out)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/out/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/out)

# 编译类型
# Debug Release MINSIZEREL RELWITHDEBINFO
# 指定默认为Debug
if(NOT DEFINED BUILD_TYPE OR NOT DEFINED CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Debug)
    message("use default build type: ${CMAKE_BUILD_TYPE}")
endif()

# 生成 compile_commands.json
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

# 设置版本文件
configure_file(VersionConfig.h.in "${PROJECT_SOURCE_DIR}/common/include/${PROJECT_NAME}_version.h")
# 记录编译时间
string(TIMESTAMP COMPILE_TIME %Y%m%d-%H%M%S)

## -----------------------------------------------------------------------------------------------------------------##
# unit test
include(CTest)
if(BUILD_TESTING)
    include(GoogleTest)
    enable_testing()

    set(CTEST_OUTPUT_ON_FAILURE TRUE)
    set(GTEST_COLOR TRUE)
endif()

mark_as_advanced(
    BUILD_GMOCK BUILD_GTEST BUILD_SHARED_LIBS 
    gmock_build_tests gtest_build_samples gtest_build_tests
    gtest_disable_pthreads gtest_force_shared_crt gtest_hide_internal_symbols
)

## ---------------------------------------------------------------------- ----------------------------------------------##

# opencv lib 目录
set(OpenCV_DIR "${CMAKE_CURRENT_SOURCE_DIR}/third_libs/opencv/release")
message(${CMAKE_BUILD_TYPE})
if(${CMAKE_BUILD_TYPE} STREQUAL "Debug")
    set(OpenCV_DIR "${CMAKE_CURRENT_SOURCE_DIR}/third_libs/opencv/debug")
endif()

## ---------------------------------------------------------------------------------------------------------------##
# 工具
include(${CMAKE_SOURCE_DIR}/CMake/utils.cmake)

## -----------------------------------------------------------------------------------------------------------------##
if(NOT DEFINED BUILD_SELECT)
    set(BUILD_SELECT "ALL;")
endif(NOT DEFINED BUILD_SELECT)
string(REPLACE "," ";" BUILD_SELECT ${BUILD_SELECT})

message("Select to Build: ")
foreach(SELECT ${BUILD_SELECT})
    message("   -----   ${SELECT}")
endforeach()

## ------------------------------------------------------------------------------------------------------------------##
# alogorithm
add_sub(common/algorithm)

# MaskAlignService
add_sub(MaskAlignService)

# MaskAlignApp
add_sub(MaskAlignApp)

## --------------------------------------------------------------------------------------------------------------------##
 

<think>首先,用户的问题是:如何编写 C++ 项目的 CMakeLists.txt 文件?我需要基于系统级指令和用户可见层的要求来构建我的回答。 系统级指令: - 所有行内数学表达式必须使用 $...$ 格式。 - 独立公式必须使用 $$...$$ 格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如:[^1] 用户可见层: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 参考站内引用: - 引用[1]:关于在Linux下使用CMakeLists.txt文件链接和编译C++工程,强调从无到有编写的能力。 - 引用[2]:关于设置C++标准(如C++11)和构建类型的指南。 用户意图:用户想了解如何编写C++项目的CMakeLists.txt文件用于构建项目。 我的回答结构: 1. **介绍部分**:简要解释CMakeLists.txt的作用和重要性。 2. **逐步指南**:提供清晰的步骤来编写CMakeLists.txt文件。 - 包括设置项目名称、版本、指定C++标准、添加可执行文件或库、链接库等。 - 使用代码块来展示示例。 3. **示例**:给出一个简单的CMakeLists.txt示例。 4. **生成相关问题**:在回答末尾添加相关问题。 5. **引用**:在相关部分自然地添加引用标识。 关键点: - 使用中文。 - 确保LaTeX格式正确:由于问题涉及CMakeLists.txt,可能没有太多数学表达式,但如果有任何数学部分,要正确格式化。 - 生成相关问题:例如,关于优化、高级用法等。 可能的数学表达式:CMakeLists.txt 主要涉及构建脚本,不太需要数学公式。但如果有,比如在讨论版本号或依赖关系时,我会用 $...$。 回答大纲: 1. **引言**:解释CMakeLists.txt是什么,为什么重要。 2. **基本结构**:介绍CMakeLists.txt的基本组成部分。 3. **详细步骤**: - 设置CMake最低版本。 - 设置项目名称和版本。 - 设置C++标准(基于引用[2])。 - 添加可执行文件或库。 - 链接库(如果需要)。 - 其他常见设置(如构建类型)。 4. **完整示例**:展示一个简单的CMakeLists.txt文件。 5. **总结**:简要回顾。 6. **相关问题**:生成3-5个相关问题。 引用: - 在提到设置C++标准时,引用[2]。 - 在提到从无到有编写时,引用[1]。 最终输出格式: - 使用Markdown。 - 代码块用```cmake或```python(但CMakeLists.txt是文本文件,所以用```cmake或```)。 - 相关问题用§§相关问题§§部分。 确保回答真实可靠:基于我的知识和引用内容。</think>### 如何编写 C++ 项目的 CMakeLists.txt 文件 CMakeLists.txt 文件是 CMake 构建系统的核心配置文件,用于自动化编译、链接和构建 C++ 项目。它允许您定义项目结构、依赖库和编译选项,确保跨平台兼容性。在 Linux 系统下,CMakeLists.txt 是必备工具,它能帮助您从零开始构建项目[^1]。编写一个有效的 CMakeLists.txt 文件包括几个关键步骤:设置项目基本信息、指定 C++ 标准、添加源文件和目标(如可执行文件或库)、链接依赖库,以及配置构建选项。下面我将逐步指导您完成这一过程,确保结构清晰易懂。 #### 步骤 1: 设置 CMake 最低版本和项目基本信息 在文件开头,指定 CMake 的最低版本要求(确保兼容性)和项目名称、版本。这有助于 CMake 初始化构建环境。 - 使用 `cmake_minimum_required` 设置最低 CMake 版本。 - 使用 `project` 命令定义项目名称和版本。 ```cmake # 设置 CMake 最低版本要求 cmake_minimum_required(VERSION 3.10) # 推荐使用 3.10 或更高版本 # 定义项目名称和版本 project(MyCppProject VERSION 1.0 LANGUAGES CXX) # CXX 表示 C++ 项目 ``` - **说明**:`project` 命令中的 `LANGUAGES CXX` 明确指定项目使用 C++ 语言。项目名称(如 `MyCppProject`)和版本号(如 `1.0`)可根据实际情况修改。 #### 步骤 2: 设置 C++ 标准 C++ 标准(如 C++11、C++17)决定了代码的兼容性和特性支持。在 CMakeLists.txt 中,强制设置标准可避免编译器错误[^2]。 - 使用 `set` 命令设置 C++ 标准。 - 添加 `CMAKE_CXX_STANDARD_REQUIRED ON` 确保编译器强制使用指定标准。 ```cmake # 设置 C++ 标准为 C++11,并强制要求 set(CMAKE_CXX_STANDARD 11) # 可改为 14、17 等 set(CMAKE_CXX_STANDARD_REQUIRED ON) # 如果编译器不支持,则报错停止构建 ``` - **说明**:例如,设置 `CMAKE_CXX_STANDARD 17` 可启用 C++17 特性。`CMAKE_CXX_STANDARD_REQUIRED ON` 确保构建失败时提供明确错误,提高可靠性[^2]。 #### 步骤 3: 添加可执行文件或库 根据项目需求,定义构建目标(如可执行文件或静态/动态库)。使用 `add_executable` 创建可执行文件,或 `add_library` 创建库。 - 指定源文件列表(如 `.cpp` 文件)。 - 示例:添加一个名为 `main` 的可执行文件。 ```cmake # 添加可执行文件,源文件为 main.cpp add_executable(main src/main.cpp) # src/main.cpp 是源文件路径 # 或者添加一个库 # add_library(my_library STATIC src/lib.cpp) # STATIC 表示静态库 ``` - **说明**:源文件路径支持通配符(如 `src/*.cpp`),但不推荐在生产环境中使用,以避免意外包含文件。路径应基于项目目录结构。 #### 步骤 4: 链接依赖库 如果项目依赖外部库(如 Boost 或 OpenCV),使用 `target_link_libraries` 命令链接它们。 - 先使用 `find_package` 查找库(如果需要)。 - 然后链接到目标。 ```cmake # 查找依赖库,例如 OpenCV find_package(OpenCV REQUIRED) # REQUIRED 表示找不到则报错 # 将库链接到可执行文件 target_link_libraries(main PRIVATE ${OpenCV_LIBS}) # main 是步骤 3 定义的目标 ``` - **说明**:`PRIVATE` 表示链接仅适用于当前目标,不影响其他目标。常用库如 OpenCV 可通过 `find_package` 自动检测路径。 #### 步骤 5: 配置构建类型和其他选项 设置构建类型(如 Debug 或 Release)以优化性能或调试。还可添加编译选项。 - 使用 `set` 设置构建类型。 - 使用 `target_compile_options` 添加编译标志。 ```cmake # 设置默认构建类型为 Debug(开发时)或 Release(发布时) set(CMAKE_BUILD_TYPE Debug) # 可选: Release, RelWithDebInfo # 添加编译选项,例如启用警告 target_compile_options(main PRIVATE -Wall -Wextra) # -Wall 启用所有警告 ``` - **说明**:构建类型影响优化级别;Debug 包含调试信息,Release 优化性能。编译选项如 `-Wall` 可提升代码质量[^2]。 #### 完整示例 CMakeLists.txt 文件 以下是一个简单的 CMakeLists.txt 示例,适用于一个包含主文件的 C++ 项目: ```cmake # 步骤 1: 设置 CMake 版本和项目 cmake_minimum_required(VERSION 3.10) project(SimpleApp VERSION 1.0 LANGUAGES CXX) # 步骤 2: 设置 C++ 标准 set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 步骤 3: 添加可执行文件 add_executable(app main.cpp) # 假设 main.cpp 在项目根目录 # 步骤 4: 链接库(此处无外部库,省略) # target_link_libraries(app PRIVATE some_lib) # 步骤 5: 配置构建类型 set(CMAKE_BUILD_TYPE Debug) target_compile_options(app PRIVATE -Wall) ``` #### 构建和运行项目 1. 在项目根目录创建 `build` 文件夹:`mkdir build && cd build` 2. 运行 CMake:`cmake ..` (生成 Makefile) 3. 编译项目:`make` 4. 运行可执行文件:`./app` #### 总结 编写 CMakeLists.txt 文件的核心是定义项目结构、设置 C++ 标准、添加目标和链接库。通过以上步骤,您可以从无到有创建高效的构建配置[^1]。记住,CMake 语法强调模块化,复杂项目可拆分为多个 CMakeLists.txt 文件(如子目录中使用 `add_subdirectory`)。实践时,参考 CMake 官方文档可解决进阶问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值