cmake-debug和release模式

本文介绍了如何使用CMake构建Debug和Release版本的项目。通过CMakeLists.txt中的条件判断,设置不同的编译标志,实现不同模式的编译。在Debug模式下,编译选项为-Wall-O0,生成的可执行文件包含调试信息,文件较大;在Release模式下,编译选项为-Wall-O3,优化代码,生成的文件较小。同时,文章强调了在CMake中使用if命令时变量引用的注意事项,避免语法错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般在工程中,自动构建可能会编译两个版本的发布包,一个debug版本,一个release版本。那么通过cmake怎样来实现呢?本文就以这个需求为例,来介绍cmake中的逻辑控制。

目录结构

|-- bin
|-- build
|-- CMakeLists.txt
|-- src
|   `-- main.c

Debug-Release模式控制
顶层CMakeLists.txt

cmake_minimum_required(VERSION 3.12)
project(test07)

aux_source_directory(${PROJECT_SOURCE_DIR}/src src_dirs)

# 条件判断
if(CMAKE_BUILD_TYPE AND (CMAKE_BUILD_TYPE STREQUAL "Debug"))
    set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wall -O0")
    message("Debug mode:${CMAKE_C_FLAGS_DEBUG}")
    add_executable(test_debug ${src_dirs})

elseif(CMAKE_BUILD_TYPE AND (CMAKE_BUILD_TYPE STREQUAL "Release"))
    set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Wall -O3")
    message("Release mode:${CMAKE_C_FLAGS_RELEASE}")
    add_executable(test_release ${src_dirs})
else()
    message("else:${CMAKE_BUILD_TYPE}")
    message("else:${CMAKE_C_FLAGS_RELEASE}")
    add_executable(test_release ${src_dirs})
endif()

先简要的描述一下该CMakeLists.txt的控制逻辑。如果CMAKE_BUILD_TYPE的值为"Debug"就采用debug模式编译;如果CMAKE_BUILD_TYPE的值为"Release"就采用release模式编译;如果CMAKE_BUILD_TYPE的值为空,默认采用release模式

默认编译

 从上图可以看出,CMAKE_C_FLAGS_RELEASE 编译选项的默认值为-O3 -DNDEBUG。最终生成可执行文件test_release,./test_release输出’hello cmake’。test_release文件大小为8600字节。

release 编译


从上图可以看出,通过cmake命令行指定CMAKE_BUILD_TYPE为Release,最终生成可执行文件test_release,./test_release输出’hello cmake’。test_release文件大小为8600字节。

debug编译


从上图可以看出,通过cmake命令行指定CMAKE_BUILD_TYPE为Debug,最终生成可执行文件test_release,./test_release输出’hello cmake’。test_release文件大小为9872字节。因为debug模式编译生成的可执行文件包含可调试的相关信息,所以文件大小会变大。

控制逻辑

通过上例知道,可以通过if命令来控制cmake的编译逻辑,接下来,详细介绍cmake中if命令的使用。

条件命令

if(<condition>)
  <commands>
elseif(<condition>) # optional block, can be repeated
  <commands>
else()              # optional block
  <commands>
endif()

if条件命名的语法非常简单。这里需要特别说明关于if(<variable>)中variable的注意点,引用文档中的一段话:

The if command was written very early in CMake’s history, predating the ${} variable evaluation syntax, and for convenience evaluates variables named by its arguments as shown in the above signatures. Note that normal variable evaluation with ${} applies before the if command even receives the arguments.

这段话的意思是,由于if命令语法在变量引用${}语法之前出现,所以如果使用if(${var}),那么将会被引用两次;如果使用if(var),将只会被if本身的语法引用一次。也就是要注意两次引用问题。

举个栗子:

# 在前面的CMakeLists.txt中
if(CMAKE_BUILD_TYPE AND (CMAKE_BUILD_TYPE STREQUAL "Debug"))

如果是通过cmake .. 编译,而没有指定CMAKE_BUILD_TYPE的话,那么if命令本身会引用变量CMAKE_BUILD_TYPE,其值为空,if条件判断为假;
如果是通过cmake -DCMAKE_BUILD_TYPE=Debug .. 编译,if命令本身会引用变量CMAKE_BUILD_TYPE,其值为Debug,if条件判断为真;

# 如果将变量CMAKE_BUILD_TYPE通过${}再引用一次,会发生什么?
if(${CMAKE_BUILD_TYPE} AND (CMAKE_BUILD_TYPE STREQUAL "Debug"))

由于 ${CMAKE_BUILD_TYPE}的值为空,if(${CMAKE_BUILD_TYPE}相当于if(空变量),然后if命令再对"空变量"进行引用,显然,语法上错误。即会报如下图错误:


如果你非要使用if($var),那你必须明确的知道变量var的值是另一个变量的变量名。

 例如,将前面的CMakeLists.txt做如下修改(虽然没有什么实际意义,仅作为解释语法特点)

cmake_minimum_required(VERSION 3.12)
project(test07)

aux_source_directory(${PROJECT_SOURCE_DIR}/src src_dirs)

set(mode "CMAKE_BUILD_TYPE") # 修改点

# 条件判断
if(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Debug")) # 修改点
    set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wall -O0")
    message("Debug mode:${CMAKE_C_FLAGS_DEBUG}")
    add_executable(test_debug ${src_dirs})

elseif(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Release")) # 修改点
    set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Wall -O3")
    message("Release mode:${CMAKE_C_FLAGS_RELEASE}")
    add_executable(test_release ${src_dirs})
else()
    message("else:${CMAKE_BUILD_TYPE}")
    message("else:${CMAKE_C_FLAGS_RELEASE}")
    add_executable(test_release ${src_dirs})
endif()
 

<think>好的,我现在需要帮助用户解决他们在终端中运行CMake命令时遇到的“zsh: command not found: cmake”错误。用户的具体操作是在CLion的cmake-build-debug目录下执行了命令`cmake --build ... --target flash -- -j 1`,结果系统提示找不到cmake命令。我需要分析可能的原因并提供解决方案。 首先,我应该考虑用户可能没有安装CMake,或者CMake的路径没有正确添加到环境变量中。macOS默认可能没有预装CMake,特别是如果用户是新手开发者,可能没有手动安装过。此外,如果用户通过Homebrew或其他包管理器安装,可能需要检查安装路径是否在PATH中。 接下来,用户可能在CLion中使用CMake,但CLion通常自带CMake的捆绑版本。但如果在终端中直接运行cmake命令,系统可能找不到CLion自带的CMake,因为它的路径可能没有被添加到用户的shell配置文件中。比如,CLion的CMake可能安装在用户的应用目录下,如`/Applications/CLion.app/Contents/bin/cmake`,但这个路径可能不在用户的PATH环境变量中。 另外,用户可能安装了CMake,但安装过程中出现了问题,或者安装后没有重新启动终端,导致环境变量没有更新。还有可能是用户拼写错误,但根据用户提供的命令来看,命令是正确的,所以应排除拼写错误。 解决这个问题的方法可能有几个步骤:首先建议用户检查是否安装了CMake,可以通过在终端运行`cmake --version`来验证。如果未安装,指导用户通过Homebrew安装,或者从CMake官网下载安装包。如果已安装但不在PATH中,需要指导用户将CMake的路径添加到.zshrc文件中,并应用更改。 另外,如果用户使用CLion自带的CMake,可能需要找到CLion安装的CMake路径,并将其添加到PATH中,或者在终端中使用绝对路径来执行CMake命令。例如,使用`/Applications/CLion.app/Contents/bin/cmake`代替直接输入`cmake`。 还需要考虑用户是否在正确的目录下运行命令,或者是否存在项目配置问题。但根据错误信息,问题显然在于系统找不到cmake命令,所以主要问题还是CMake的安装或路径配置。 最后,需要以清晰的中文步骤指导用户逐一排查,确保用户能够理解并执行每个步骤,同时保持回答的结构逻辑性,帮助用户逐步解决问题。</think>--- 当你在终端执行 `cmake` 命令时出现 `zsh: command not found: cmake` 错误,说明系统未找到 CMake 的可执行文件。以下是逐步排查解决方法: --- ### **1. 确认是否安装了 CMake** #### **检查安装状态**: 在终端输入以下命令,查看是否返回 CMake 版本信息: ```bash cmake --version ``` - **若返回版本号**(如 `cmake version 3.28.3`):说明已安装,但可能路径未配置正确。 - **若提示 `command not found`**:说明未安装 CMake--- ### **2. 安装 CMake** #### **方法一:通过 Homebrew 安装(推荐)** 1. 安装 Homebrew(如果未安装): ```bash /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" ``` 2. 通过 Homebrew 安装 CMake: ```bash brew install cmake ``` #### **方法二:手动下载安装包** 1. 访问 [CMake 官网](https://cmake.org/download/)。 2. 下载 macOS 的 `.dmg` 安装包,双击安装。 --- ### **3. 配置 CMake 到环境变量** 如果已安装但依然报错,可能是 CMake 的路径未添加到 `PATH` 环境变量。 #### **确认 CMake 安装路径**: - **通过 Homebrew 安装**:默认路径为 `/usr/local/bin/cmake`。 - **手动安装**:默认路径为 `/Applications/CMake.app/Contents/bin/cmake`。 #### **添加路径到 `PATH`**: 1. 打开终端,编辑 `~/.zshrc` 文件: ```bash nano ~/.zshrc ``` 2. 在文件末尾添加以下内容: ```bash export PATH="/usr/local/bin:$PATH" # Homebrew 安装的 CMake # 或 export PATH="/Applications/CMake.app/Contents/bin:$PATH" # 手动安装的 CMake ``` 3. 保存文件(按 `Ctrl+O` → 回车),退出(按 `Ctrl+X`)。 4. 使配置生效: ```bash source ~/.zshrc ``` --- ### **4. 验证是否修复** 重新执行命令,确认不再报错: ```bash cmake --version ``` --- ### **5. 在 CLion 中编译项目** 如果问题已解决,回到 CLion 项目目录,重新执行原命令: ```bash cmake --build ... --target flash -- -j 1 ``` - **注意**:`...` 应为实际的 CMake 构建目录路径(例如 `cmake-build-debug` 或 `cmake-build-release`),需替换为完整路径。 --- ### **常见问题补充** - **CLion 自带的 CMake**:CLion 默认会捆绑 CMake,但仅限在 IDE 内部使用。若要在终端使用,仍需单独安装系统级 CMake- **权限问题**:如果安装后仍报错,尝试赋予执行权限: ```bash sudo chmod +x /usr/local/bin/cmake ``` --- 如果以上步骤仍无法解决,请提供以下信息以便进一步排查: 1. 终端执行 `echo $PATH` 的输出。 2. 执行 `which cmake` 的结果。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值