各种工具,可真多。
1 make & makefiles
g++ 编译的 4 个过程
- 预处理,-E 表示编译器仅对输入文件进行预处理,之后还是源文件
1
| g++ -E test.cpp -o test.i
|
- 汇编语言,生成机器语言的目标代码(注意这边的 c 是个小写的):正确的源文件都可以被编译成目标文件,每个源文件都有一个对应的目标文件。编译器只检查语法,函数和变量是否被声明。
- 链接,生成可执行文件:使用目标文件链接成库文件。目标文件太多了,链接时需要指出目标文件的文件名,对于编译很不方便,给目标文件打个包,这个包就是库文件。链接器会在所有的目标文件中寻找函数的实现。
一个小例子说明 makefile
当需要编译很多源文件的大工程时,可以使用 makefiles 让编译更高效。makefiles 是一系列的 gcc/g++ 命令,并且记录文件之间的依赖关系。Make 是一个工具,执行 makefiles 中的内容。
具体函数的实现
1 2 3 4 5 6 7 8 9 10 11 12 13
| #include<iostream> #include "Hello.h" using namespace std; Hello::Hello(){
} int Hello::Display(){ cout << "Hello,ivy!\n" << endl; return 0; }
|
头文件中是声明
1 2 3 4 5 6
| class Hello { public: Hello(); int Display(); };
|
总的文件
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 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)
project(HELLOWORLD)
set(SRC sayhello.cpp hello.cpp)
include_directories(/usr/include/myincludefolder ./include)
link_directories(/usr/lib/mylibfolder ./lib)
add_library(hello SHARED ${SRC})
add_executable(main main.cpp)
target_link_libraries(main hello)
|
源文件中主目录的 CMakeLists.txt 通过 add_subdirectory 添加子目录的 CMakeLists.txt
1 2 3 4
| 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 手册详解