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 工具,你可以按照以下步骤进行操作:

  1. 安装 Borland C++ 编译器,并将其添加到系统的 PATH 环境变量中。你需要确保在命令行中可以使用 bcc32 命令来编译 C++ 代码。
  2. 确认 Borland 的 make 工具已经包含在 Borland C++ 编译器中。在命令行中输入 make -v 命令来查看 make 版本信息。如果命令行中显示 “Borland Make Version X.XX” 或 “Embarcadero Make Version X.XX” 等信息,那么 Borland 的 make 工具已经包含在 Borland C++ 编译器中。
  3. 在项目根目录下创建一个名为 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.基本语法规则

  1. 变量使用${}方式取值,但是在IF控制语句中直接取值
  2. 指令(参数1 参数2 ....),参数用空格或者分号分割
  3. 指令是大小写无关的,指令和变量是大小写相关的,但是推荐全部使用大写
  4. 作为工程名的HELLO和生成的可执行文件hello没有任何关系,你可以随意在ADD_EXECUTABLE中修改你的可执行文件的名字。

如果一个源文件的名字出现了空格: ma in.cpp那么推荐你使用 "" 将源文件包含进来。

使用以下的命令来清理工程:(在build文件夹中)

mingw32-make clean

什么是out-of-source 外部编译

我们刚才举得例子就是外部编译的例子,即我们在项目目录test1中创建了一个build编译目录,因此所有的编译条件都发生在build中,对我们的test1项目文件夹没有任何影响。

posted @ 2023-03-24 11:25  hugeYlh  阅读(71)  评论(0编辑  收藏  举报