CMake学习(1)-基本操作与命令
文章首发于:My Blog 欢迎大佬们前来逛逛
初学者对于CMake学习的简单总结,大佬指点轻喷!!!!
1. 编写一个最简单的Cmake程序
1.1 GNU make
首先打开cmd窗口,在一个目录新创建一个文件夹:
linux中运行一下命令:
mkdir -p ./cmake/test1
windows中运行一下命令
md .\cmake\test1 cd cmake/test1
表示递归创建一个cmake文件夹与test1文件夹,其中test1就是我们的cmake项目文件夹,进入我们的测试文件夹中。
执行以下命令:(code打开vscode编辑器,你也可以使用vim)
code main.cpp
然后为我们的第一个cmake项目编写一个源程序:
#include <iostream> int main(){ std::cout<<"Hello World\n"; return 0; }
保存后退出。
然后编写一个名叫 CMakeLists.txt
的文件:
code CMakeLists.txt
然后编写如下内容:
这些内容我们在之后都会解释
project(HELLO) set(src_list main.cpp) message(status "This is BINARY_DIR" ${PROJECT_BINARY_DIR}) message(status "This is SOURCE_DIR" ${PROJECT_SOURCE_DIR}) add_executable(Hello src_list)
保存后退出。
然后创建一个文件夹:
mkdir build cd build
表示我们的构建的项目的生成的文件都放在build文件夹这里。
然后执行以下命令:
cmake -G "MinGW Makefiles" ..
在当前build文件夹中构建项目,使用的构建工具是MinGW makefiles
,构建的是 ..
即上一级文件夹中的文件,构建后生成在build
里面
表示使用MinGW 的 GNU Make工具构建项目,还有一个visual studio的 Borland Make 构建工具,不过那个工具构建CMake项目比较复杂,在这里就不说了。
然后成功的话,cmd中就会显示如下的内容:
-- The C compiler identification is GNU 12.2.0 -- The CXX compiler identification is GNU 12.2.0 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: F:/vscode/mingw64/bin/gcc.exe - skipped -- Detecting C compile features -- Detecting C compile features - done -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: F:/vscode/mingw64/bin/c++.exe - skipped -- Detecting CXX compile features -- Detecting CXX compile features - done statusThis is BINARY_DIRF:/code/cmake/test1/build statusThis is SOURCE_DIRF:/code/cmake/test1 -- Configuring done -- Generating done -- Build files have been written to: F:/code/cmake/test1/build
然后我们就会发现,build里面多了很多文件与文件夹,其中最重要的是生成了一个Makefile
因此我们接下来执行如下命令:此时在build文件夹内
mingw32-make
然后就会显示如下内容:
[ 50%] Building CXX object CMakeFiles/Hello.dir/main.cpp.obj [100%] Linking CXX executable Hello.exe [100%] Built target Hello
表示我们的项目构建完整,目标程序叫做 Hello
,可以发现它生成了一个 Hello.exe 的程序
然后我们就可以运行了:
Hello.exe --------- Hello World
这就完成了最简单的使用 MinGW的 GNU make工具构建的CMake项目的一个完整的过程。
1.1 Borland make
如果你想使用 Borland 的 make 工具,你可以按照以下步骤进行操作:
- 安装 Borland C++ 编译器,并将其添加到系统的 PATH 环境变量中。你需要确保在命令行中可以使用
bcc32
命令来编译 C++ 代码。 - 确认 Borland 的 make 工具已经包含在 Borland C++ 编译器中。在命令行中输入
make -v
命令来查看 make 版本信息。如果命令行中显示 “Borland Make Version X.XX” 或 “Embarcadero Make Version X.XX” 等信息,那么 Borland 的 make 工具已经包含在 Borland C++ 编译器中。 - 在项目根目录下创建一个名为
makefile.borland
的文件,并在该文件中编写 Borland makefile 的内容。Borland 的 makefile 与 GNU makefile 有所不同,因此你需要根据 Borland makefile 的语法规则编写相应的内容。以下是一个示例makefile.borland
文件:
plaintextCopy codeCC=bcc32 CFLAGS=-vG -w- -O2 -Iinclude LFLAGS=-vG -w- -Llib LIBS=-lmylib OBJS=main.obj myapp.exe: $(OBJS) $(CC) $(LFLAGS) -e$@ $(OBJS) $(LIBS) main.obj: main.cpp $(CC) $(CFLAGS) -c $<
这个示例中,我们指定了编译器为 bcc32
,编译选项为 -vG -w- -O2 -Iinclude
,链接选项为 -vG -w- -Llib
,链接的库为 mylib
,目标文件为 myapp.exe
,源代码文件为 main.cpp
。你可以根据自己的项目需要进行相应的修改。 4. 在命令行中进入到项目根目录,执行 make -f makefile.borland
命令来编译项目。如果编译成功,你可以在当前目录下找到生成的可执行文件 myapp.exe
。 注意事项:
- Borland 的 make 工具与 GNU make 工具有所不同,具体的语法规则和使用方法可能会有所差异。你需要查阅 Borland 的 make 工具的文档来了解详细的信息。
- 如果你同时安装了 GNU make 工具和 Borland C++ 编译器,需要确保在执行
make
命令时使用 Borland 的 make 工具。你可以使用which make
命令来查看当前系统上的 make 工具路径,以确定使用的是哪个版本的 make 工具。如果该命令返回的路径指向 GNU make 工具,你需要执行make -f makefile.borland
命令来使用 Borland 的 make 工具。
2. 简单解释
2.1 project
project指令用于定义工程名称,并且可以指定工程的语言,支持的语言列表是可选的,默认表示支持所有用语言。
project(projectname [CXX][C][Java])
其中projectname便是我们的工程的名称
同时这个名称与后面的两个变量是相互联系的:
<projectname>_BINARY_DIR <projectname>_SOURCE_DIR
我们的两个Message的指令就使用了这个project的名称,因此可以把Message的两个命令的前面指定与你的project设置的名字相同,比如:
project(Hello) Hello_BINARY_DIR Hello_SOURCE_DIR
不过如果需要改变project 的名字的时候,后续也需要修改此处,所以直接把他们声明为 PROJECT_BINARY_DIR
为妙。
2.2 set
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
set可以用来显式的定义变量。
我们可以使用set来包含多个源文件,比如我们用到了main.cpp,因此需要在set中指明包含这个源文件,同样如果需要多个源文件,则可以在后面添加多个。
定义变量:可以使用set命令来定义一个新的变量,并给它赋初值。例如:
set(SRC_FILES main.cpp utils.cpp)
这个命令将会定义一个名为 SRC_FILES
的变量,它的值为 main.cpp utils.cpp
2.3 message
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)
message用于向终端输出用户定义的信息。
包含以下三种类型:
- SEND_ERROR:产生错误,生成过程被跳过
- STATUS:输出前缀的信息
- FATAL_ERROR:立即终止所有的CMake过程
2.4 add_executable
ADD_EXECUTABLE(hello ${SRC_LIST})
这个命令的作用是生成一个名称为hello
的可执行文件,相关的源文件是 SRC_LIST中定义的变量,即你可以这样写:
add_executable(hello main.cpp)
在本例中,我们使用了 ${}
来引用变量,这是 cmake 的变量应用方式,但是也有一些例外,我们以后再说。
因此对于本例,我们可以缩写成这样一个最简单的版本:
project(HELLO) add_executable(hello main.cpp)
3.基本语法规则
- 变量使用
${}
方式取值,但是在IF控制语句中直接取值 - 指令(参数1 参数2 ....),参数用空格或者分号分割
- 指令是大小写无关的,指令和变量是大小写相关的,但是推荐全部使用大写
- 作为工程名的HELLO和生成的可执行文件hello没有任何关系,你可以随意在ADD_EXECUTABLE中修改你的可执行文件的名字。
如果一个源文件的名字出现了空格: ma in.cpp
那么推荐你使用 ""
将源文件包含进来。
使用以下的命令来清理工程:(在build文件夹中)
mingw32-make clean
什么是out-of-source 外部编译
?
我们刚才举得例子就是外部编译的例子,即我们在项目目录test1
中创建了一个build
编译目录,因此所有的编译条件都发生在build中,对我们的test1项目文件夹没有任何影响。
本文来自博客园,作者:hugeYlh,转载请注明原文链接:https://www.cnblogs.com/helloylh/p/17250949.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)