今天聊聊CMake。
今天用ssh链接的时候总是不成功,最后发现问题出在忘记了把CMake的工具链换成远程主机,导致一直在本地主机构建。
但是改了这个之后还报错:
Error: /home/valeria/妗岄潰/cmake-build-debug- is not a directory
原因是构建目录有误,图中可以看到构建目录是cmake-build-debug-,问题就出在最后这个短横杠上,导致挂载到远程虚拟机的时候找不到正确的目录。把最后的-去掉就好了。
使用 SSH 挂载的步骤(以 CLion 为例)
(1) 配置远程主机
打开 CLion 设置 -> 构建、执行和部署 -> 部署(Deployment)。
添加一个新的配置(选择 SFTP 类型),输入远程主机的 IP 地址、用户名、密码或密钥文件。
指定远程项目路径(例如 /home/valeria/project)。
(2) 配置工具链
打开 CLion 设置 -> 构建、执行和部署 -> 工具链(Toolchains)。
添加一个新的工具链,选择类型为 远程主机(Remote Host)。
设置远程主机(SSH 配置),CLion 会自动检测远程的编译器和 CMake。
(3) 配置 CMake
打开 CLion 设置 -> 构建、执行和部署 -> CMake。
指定使用的工具链为刚刚配置好的远程主机工具链。
设置生成目录,例如 /home/valeria/project/build。
(4) 构建、运行和调试
在 CLion 中点击运行,代码会自动通过 SSH 上传到远程主机,CMake 会在远程主机上生成构建文件并执行编译。
CLion 会通过 SSH 启动远程的可执行文件,并自动附加调试器。
所以CMake到底是什么?又有什么作用?
先看它的定义:
CMake(Cross-Platform Make)是一个开源的、跨平台的构建工具,用于管理软件的构建过程。它通过使用一个叫做 CMakeLists.txt 的配置文件生成标准化的构建脚本,例如 Makefile 或其他 IDE 的项目文件(如 Visual Studio、Xcode 工程文件等)。
CMake 并不是一个构建工具本身,而是一个 构建配置工具,它的主要功能是生成用于实际编译的构建文件(如 Makefile 或 Ninja 文件)。
CMake的主要作用就是为不同的编译环境生成对应的构建文件。比如:
Linux:生成makefile;
Windows:生成 Visual Studio 的工程文件或 Ninja 构建文件;
macOS:生成 Xcode 工程文件或 Makefile。
并且,使用相同的 CMakeLists.txt 文件即可在不同平台上构建项目,无需单独适配。
上面出错的构建目录是什么?
CMake 的构建目录是项目构建过程中的一个临时工作区,用来存放构建过程中产生的所有文件(Makefile、对象文件、可执行文件等)。它的主要作用是:
1、隔离源码与构建产物,保持项目清晰。
2、支持多配置管理(Debug、Release 等)。
3、便于调试和排查构建问题。
为什么远程挂载和CMake息息相关?
因为CMake 是一个跨平台构建工具,但在某些情况下,项目的实际运行环境(例如目标设备、服务器或嵌入式系统)与本地开发环境并不一致。(比如这次我要将在Windows上编写的代码放到Linux中运行)为了解决这个问题,开发者通常需要将项目从本地传输到远程机器编译、构建和运行,而 SSH 提供了这种远程连接的能力。
二者关系:
CMake:负责生成跨平台的构建文件(Makefile、Ninja 文件等),并定义构建、运行和调试的规则。
SSH:通过远程挂载(如SFTP)或直接执行命令,将CMake的构建工作扩展到远程环境上。
CMake 与 SSH 在 CLion 中的工作原理
(1) 本地与远程的代码同步
CLion 提供 部署配置(Deployment Configurations) 功能,可以通过 SFTP/SSH 将本地代码上传到远程目录。本地的代码通过 SFTP 自动同步到远程服务器的指定路径。每次保存或修改代码时,CLion 会根据部署规则将文件传输到远程服务器。
(2) 远程执行 CMake
配置远程主机后,CMake 会通过 SSH 在远程机器上执行。
CLion 会自动调用远程的 CMake 程序生成构建系统(例如 Makefile 或 Ninja 文件)。
(3) 使用远程编译器和工具链
在远程机器上,CMake 会调用其本地的编译器(如 gcc 或 clang)和相关的库,而不是使用本地环境的工具链。这解决了本地和远程环境不一致的问题。
(4) 远程运行与调试
编译完成后,CLion 会通过 SSH 运行远程可执行文件,并通过 GDB(远程调试器)调试目标程序。
调试过程中,CLion 会通过 SSH 将远程设备上的调试信息传输到本地显示。