palabos使用-Cmake编译

palabos使用-Cmake编译

各种工具,可真多。

1 make & makefiles

g++ 编译的 4 个过程

  • 预处理,-E 表示编译器仅对输入文件进行预处理,之后还是源文件
1
g++ -E test.cpp -o test.i
  • 编译,产生汇编语言文件
1
g++ -S test.i -o test.s
  • 汇编语言,生成机器语言的目标代码(注意这边的 c 是个小写的):正确的源文件都可以被编译成目标文件,每个源文件都有一个对应的目标文件。编译器只检查语法,函数和变量是否被声明
1
g++ -c test.s -o test.o
  • 链接,生成可执行文件:使用目标文件链接成库文件。目标文件太多了,链接时需要指出目标文件的文件名,对于编译很不方便,给目标文件打个包,这个包就是库文件。链接器会在所有的目标文件中寻找函数的实现
1
g++ test.o -o test

一个小例子说明 makefile

  • makefile: 文件依赖关系+编译命令

当需要编译很多源文件的大工程时,可以使用 makefiles 让编译更高效。makefiles 是一系列的 gcc/g++ 命令,并且记录文件之间的依赖关系。Make 是一个工具,执行 makefiles 中的内容。

  • Hello.cpp

具体函数的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
//这是Hello.cpp
#include<iostream>
#include "Hello.h"
using namespace std;

Hello::Hello(){

}

int Hello::Display(){
cout << "Hello,ivy!\n" << endl;
return 0;
}
  • Hello.h

头文件中是声明

1
2
3
4
5
6
//这是Hello.h
class Hello {
public:
Hello();
int Display();
};
  • main.cpp

总的文件

1
2
3
4
5
6
7
#include <iostream>
#include "Hello.h"
int main(){
Hello theHello;
theHello.Display();
return 0;
}
  • 用命令行的方法分四步编译
1
2
3
4
5
6
7
8
$ g++ -E Hello.cpp -o Hello.i
$ g++ -E main.cpp -o main.i
$ g++ -S Hello.cpp -o Hello.s
$ g++ -S main.cpp -o main.s
$ g++ -c Hello.cpp -o Hello.o
$ g++ -c main.cpp -o main.o
$ g++ Hello.o main.o -o main
$./main
  • 用 makefile 文件编译,学习写这个文件看这边 $\to$ makefile

clean 命令后面没有依赖关系,所以得用 make clean 命令来执行。

1
2
3
4
5
6
7
8
Hello:mian.o Hello.o
g++ main.o Hello.o -o Hello
mian.o:main.cpp
g++ -c main.cpp -o main.o
Hello.o:Hello.cpp
g++ -c Hello.cpp -o Hello.o
clean:
rm Hello.o main.o Hello

makefile 中定义变量,并且用 $(变量名) 使用变量。类似于宏,只要修改一处即可。

1
2
3
4
5
6
7
8
9
10
object = main.o Hello.o

Hello: $(object)
g++ $(object) -o Hello
mian.o:main.cpp
g++ -c main.cpp -o main.o
Hello.o:Hello.cpp
g++ -c Hello.cpp -o Hello.o
clean:
rm $(object) Hello
  • makefile 可以自动推导依赖文件的关系,以及命令
1
2
3
4
5
6
7
8
object = main.o Hello.o

Hello: $(object)
g++ $(object) -o Hello
mian.o:
Hello.o:
clean:
rm $(object) Hello

2 Cmake

对于大型工程,写 makefile 是很困难的,于是有了 Cmake 这个工具。Cmake 是一个自动生成 makefiles 的工具。CMake是一个跨平台的安装编译工具,可以用简单的语句来描述所有平台的安装(编译过程)。

语法特性介绍

  • 基本语法格式:指令(参数1 参数2…)

参数用括弧括起来,参数之间用空格或是分号分开

  • 指令是大小写无关的,参数和变量是大小写相关的

  • 变量使用${}方式取值,但是在 IF 语句中直接使用变量名

重要指令和常用变量

  • 重要指令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 指定最低版本要求
cmake_minimum_required(VERSION 2.8.3)

# 指定工程名称为 HELLOWORLD
project(HELLOWORLD)

# 显式定义变量,定义变量 SRC,其值为 sayhello.cpp hello.cpp
set(SRC sayhello.cpp hello.cpp)

# include_directories 指定头文件的搜索路径,相当于 g++ 编译器的 -l 参数
include_directories(/usr/include/myincludefolder ./include)

# link_directories 向工程中添加多个库文件的搜索路径
link_directories(/usr/lib/mylibfolder ./lib)

# add_library 通过前面定义的变量生成 libhello.so 共享库
add_library(hello SHARED ${SRC})

# add_executable编译 main.cpp 生成可执行文件 main
add_executable(main main.cpp)

# target_link_libraries 为可执行文件 main 链接 hello 动态库
target_link_libraries(main hello)

# ...

源文件中主目录的 CMakeLists.txt 通过 add_subdirectory 添加子目录的 CMakeLists.txt

  • 常用变量
1
2
3
4
# 变量 CMAKE_BUILD_TYPE,设置编译类型为 Debug
set(CMAKE_BUILD_TYPE Debug)

# ...

Cmake 编译工程

  • 外部构建:

创建 build 文件夹,加输出的中间文件都放在这个里面

Cmake 代码实践1:超级小的工程

还是 一个小例子说明 makefile 中的三个文件,文件结构:

1
2
3
4
5
6
7
8
# 指定最低版本要求
cmake_minimum_required(VERSION 3.0)

# 指定工程名称
project(HELLO)

# 生成可执行文件
add_executable(main main.cpp)

参考资料

简单构建linux c++ cmake工程结构

干货:构建C/C++良好的工程结构

《CMake实践》

基于VSCode和CMake实现C/C++开发 | Linux篇

CMake 手册详解

作者

缪红林

发布于

2021-05-18

更新于

2021-06-08

许可协议

评论