在Linux系统下使用cmake工具构建项目的简单示例,内容来自《CMake Practice》。
1. 准备工作
新建文件夹t1,然后在t1文件夹下新建hello.h
,hello.cpp
,main.cpp
和CMakeLists.txt
(注意大小写)。
目录结构:
t1
|______hello.h
|______hello.cpp
|______main.cpp
|______CMakeLists.txt
文件内容:
hello.h
# ifndef HELLO_H
# define HELLO_H
void print();
# endif
hello.cpp
# include "hello.h"
# include <iostream>
void print() {
std::cout << "Hello world!" << std::endl;
}
main.cpp
#include <iostream>
using namespace std;
int main()
{
cout << "Hello world!" << endl;
return 0;
}
CMakeLists.txt
project(HELLO)
set(SRC_LIST main.cpp hello.h hello.cpp)
add_executable(hello ${SRC_LIST})
代码解释
-
project(HELLO)
,将项目名称设置为HELLO
-
set(SRC_LIST main.cpp)
,其中set
指令用来设置变量,将变量的值设置为后面的字符串,这里用SRC_LIST
代替main.cpp hello.h hello.cpp
-
add_executable(hello ${SRC_LIST})
,其中hello
是可执行文件的文件名,后面跟需要的源文件名,这里使用变量SRC_LIST
代替所有源文件,引用变量时用${}
将变量括起来
2. 开始构建
t1目录中应该包含main.cpp
和CMakeLists.txt
这两个文件。将工作目录切换到t1,在目录中运行命令
cmake . # .代表当前工作目录
如果是在Windows系统下使用MinGW的话,需要指定生成的makefile的版本
cmake -G "MinMG Makefiles" . # Windows+MinGW
输出大概是这个样子
-- The C compiler identification is GNU 9.3.0
-- The CXX compiler identification is GNU 9.3.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- This is BINARY dir /home/xxx/Documents/cmake/t1
-- This is SOURCE dir /home/xxx/Documents/cmake/t1
-- Configuring done
-- Generating done
-- Build files have been written to: /home/xxx/Documents/cmake/t1
这个时候目录里自动生成了Makefile
文件,在当前文件夹下使用make
命令构建
make
会看到以下输出
Scanning dependencies of target hello
[ 50%] Building CXX object CMakeFiles/hello.dir/main.cpp.o
[100%] Linking CXX executable hello
[100%] Built target hello
这时候会发现目录里生成了目标文件hello
,用以下命令执行目标文件,
./hello
得到输出Hello world!