披着CLion的外衣实则在讲CMake
### CLion 配置 #### 安装和基础设置 至于 CLion 安装和基础设置,网上教程一大把,而且不是学习重点,根据自己需求配置即可。 #### 工具链配置 这个配置是进行 C++ 开发的关键,因为这个编译工具链就意味着 C++ 的编译环境。 按下图点开对应的信息,如果你任何编译工具链都没有添加,由于新版本的 CLion 它会自带一个 mingw 的编译套件,所以默认会有一个 CLion 自带的 mingw 编译工具链。 如下图所示我的编译工具链稍微有点丰富,有 msvc、g++、clang++、mingw,作为一个刚刚入门学编程的新手,我建议编译工具链这一块暂时就没必要了解了,但在 CLion 中编译的具体配置流程我认为还是有必要讲清楚。  CLion 中添加编译工具链非常简单,你本机把对应工具链的路径加入到了环境变量,那么在你点击 `+` 对应编译链类型后,会自动扫描到,如果实在没有扫描到,那么也可以自己填入对应的路径,整个编译链包括: 1. cmake,用于跨平台以及简化底层编译脚本的工具。 2. cmake 生成更底层的编译命令(对应上述的 Build Tool),比如 gmake 也就是解析.makefile 文件进行命令执行,比如 ninja 解析 .ninja 文件进行命令执行(编译速度比 makefile 更快)。 3. C 语言的编译器(clang/gcc/cl 等等)。 4. C++ 的编译器(clang++/g++/cl 等等)。 如果是 mingw,那么上述的一套都是包含的,只需要把 Toolset 这个选项选择为 mingw 对应的目录即可,选择好后,CLion 会自动识别上述四件套的位置。 接下来简单介绍如何添加一些工具链: * 安装 msvc 编译工具链:直接到官网下载 VS2022,然后安装对应 C++ 环境,打开 CLion 后添加 msvc 环境时就会自动识别。官网:https://visualstudio.microsoft.com/zh-hans/vs/ * 安装 wsl2:其实 wsl2 的安装已经被简化到了极致,在 powershell 中 `wsl --install` 即可。 具体的官方文档如下:https://learn.microsoft.com/zh-cn/windows/wsl/install * 如果需要使用 CLion 进行 Qt 开发,可以查看视频讲解:[www.bilibili.com/video/BV18q…](https://link.juejin.cn?target=https%3A%2F%2Fwww.bilibili.com%2Fvideo%2FBV18q4y1i7kV%2F "https://www.bilibili.com/video/BV18q4y1i7kV/") ,对应的配置信息:[gitee.com/yuexingqin/…](https://link.juejin.cn?target=https%3A%2F%2Fgitee.com%2Fyuexingqin%2Ftemplate_qtclion "https://gitee.com/yuexingqin/template_qtclion") * 如果需要使用 CLion 进行 STM32 开发,那么可以查看稚晖君在知乎写的博客教程:[zhuanlan.zhihu.com/p/145801160](https://link.juejin.cn?target=https%3A%2F%2Fzhuanlan.zhihu.com%2Fp%2F145801160 "https://zhuanlan.zhihu.com/p/145801160") ### CMake 配置项  如上图所示,第二个 `CMake` 选项就是我们现在要讲的,而这两个正好也是整个开发环境中最重要的东西,第一个编译工具链决定了 CLion 中已经识别了本机有哪些编译环境,而第二个 `CMake` 选项,则是用于配置 cmake 基于哪些配置项生成。 所以我们现在应该了解了 CLion 是如何去编译项目生成可执行文件的了。 1. 通过 cmake 配置选项运行整个项目的 CMakeList.txt 2. 生成 makefile 或其他底层脚本后再通过对应的工具去执行这个脚本 3. 运行编译好的程序 而我们现在讲的就是添加 cmake 配置选项,如果你手动写 cmake 命令的话,那样对应的就是命令行参数了。  上述图片中已经解释了一些配置的作用。这些配置项一般是不常改动,使用默认值就行,比如 `Build options` 是执行最后的脚本所用的参数,默认为 `-j 12`,比如如果是 makefile,那么就是 `make -j12`。 下面是大家可能需要进行一些配置的选项: 1. Build type:这是程序最终编译的类型,意味着编译器该以何种程度对源代码进行优化,比如 Debug 版本一般再 gcc 中对应 o2 的优化,release 版本对应 o3 的优化,两者一般存在 10 倍左右的性能差距。 2. Toolchain:这是前面所说的编译工具链,一般来说,想要切换编译器,你切换这个选项就行了,默认使用 default 工具链。 3. Generator:这是前面所说的工具链中的较为底层的脚本的运行工具,可以是 makefile 或者 ninja,不选的话也是默认工具链里的那个。 4. CMake options:这个是 cmake 运行时可以加入的命令行参数,比如我们可以-D 来定义对应的变量控制对应的 cmake 行为,甚至于前面的 Build type 我们完全可以不写(当然这是 CLion,这个空必须得被填充),然后使用 `-DCMAKE_BUILD_TYPE=Release`,这个变量可以决定最终 cmake 生成的执行脚本是按照 release 的标准去运行的,又比如 `-DBUILD_SHARED_LIBS=ON`,那么最终是会生成动态库而不是静态库,我上图中的 `-DENABLE_TEST=ON` 是内部的 cmake 有定义一个变量默认为 OFF 值,如果为 ON 时会加入测试代码为子项目。 现在 cmake 在 CLion 中的配置项已经讲完了,简单实践一下来体验之前讲的 CLion 到整个运行的流程: 1. 通过 cmake 配置选项运行整个项目的 CMakeList.txt。 2. 生成 makefile 或其他底层脚本后再通过对应的工具去执行这个脚本。 我们先看一眼上一步 cmake 生成的文件(放出了两个不同的配置项产生的脚本,第一个使用的 Generator 为 ninja,第二个使用的为 gmake): 如果想要继续执行这个脚本,应该在 CLion 中执行对应的源代码,CLion 会自动识别入口点函数,然后给出可执行的按钮。点击执行后,不仅会直接对应的 makefile 或 build.ninja 还会顺便把这个程序运行到 CLion 内置的终端环境中。 3. 运行编译好的程序:这一步已经在第二步一并执行了。 #### CMake 的使用与实战 经过上述文字和图片讲解,我们很自然的想到,整个 CLion 运行 C++ 代码其实就是在运行 cmake 和 makefile(或 build.ninja),第二个过程我们参与不了,但是第一个 cmake 的编写过程我们却需要一直接触。 下面用 CLion 新建项目自动生成的 cmake 模板来简单对 cmake 语法热热身。 ```cmake cmake_minimum_required(VERSION 3.22) project(untitled) set(CMAKE_CXX_STANDARD 17) add_executable(untitled main.cpp) ``` * `cmake_minimum_required` 命令:规定了编译本项目的 cmake 工具至少需要 3.22 版本。 * `project` 命令:规定了本项目的项目名称,同时也根据这个传入的值生成了一堆变量,常用的如下: 1. `PROJECT_NAME` :项目名称 2. `PROJECT_BINARY_DIR` :项目的二进制文件目录,即编译后的可执行文件和库文件的输出目录 3. `PROJECT_SOURCE_DIR` :项目的源文件目录,即包含 CMakeLists.txt 文件的目录 举个简单例子说明上述变量的作用: 比如一个测试的子项目中的 CMakeList.txt,可能需要写下面的语句(先不管 file 命令),由于是作为直接的子项目,那么里面肯定不会存在 project 语句,所以 PROJECT_SOURCE_DIR 变量表示的仍然是整个项目的根目录,直接通过 `${}` 的形式来使用它即可,这样就不需要关心相对或绝对路径了。 ```cmake file(GLOB SONIC_TEST_FILES "${PROJECT_SOURCE_DIR}/tests/*.h" "${PROJECT_SOURCE_DIR}/tests/*.cpp" ) ``` * `set` 命令:设置对应变量为对应的值,该变量存在,则修改该变量的值,如果不存在则会创建并初始化为对应的值,这里对 set 的使用是设置了 CMAKE_CXX_STANDARD 变量为 17,这个变量可以控制最终编译采用的 C++ 版本,这里是使用 C++17。 * `add_executable` 命令:这是用于生成可执行程序的命令,第一个参数为该执行程序最终编译后生成的文件名,后面跟着的都是需要编译的源代码。 对于新手而言,其实不太需要自己手写 cmake,因为 CLion 会在你新建源文件的时候把相应源文件添加到 add_excutable 命令的后面,但项目稍微大一点或者说引入了很多外部库,那么大概率会抛弃 CLion 的这种自动化了。 #### 常用的 CMake 变量 下面只列出了部分变量的作用,更多的变量请查看文档:https://cmake.org/cmake/help/latest/manual/cmake-variables.7.html * `PROJECT_NAME` :项目名称 * `PROJECT_BINARY_DIR` :项目的二进制文件目录,即编译后的可执行文件和库文件的输出目录 * `PROJECT_SOURCE_DIR` :项目的源文件目录,即包含 CMakeLists.txt 文件的目录 * `CMAKE_BINARY_DIR` :当前 CMake 运行的二进制文件目录,通常和 PROJECT_BINARY_DIR 是同一个目录 * `CMAKE_SOURCE_DIR` :当前 CMake 运行的源文件目录,通常和 PROJECT_SOURCE_DIR 是同一个目录 * `CMAKE_C_STANDARD` :指定 C 语言的标准版本 * `CMAKE_CXX_STANDARD` :指定 C++ 语言的标准版本 * `
以上内容来自博客订阅源,版权归原作者。热度统计站内详情页访问。
登录后,加入这场讨论。
登录参与