Reference
GCC/Make/CMake关系
cmake make gcc
CMakelist.txt -----> Makefile ----> Cmds ---> Binary
GCC: GNU C Compiler
编译流程
预处理 编译 汇编 链接
prEprocessing assembly compilation linking
-E -S -c
b.c ------> b.i ------> b.s ------> b.o ------> a.out
gcc gcc as ld
编译参数
对于一个实际的C/C++项目而言,源文件一般不会只有一个,而且绝大多数情况下会使用到第三方库(Third-party Library)。 由于
C/C++没有官方的包管理工具(Package Manager)
,如Python的pip
,Java的maven
,Nodejs的npm
等等, 所以,在C/C++项目中使用第三方库时,一般使用系统自带的包管理器来进行第三方库的安装,例如Ubuntu下的apt-get
,macOS的brew
(Homebrew)等等。 同时,也可以选择自行获取第三方库的源码进行编译安装。
Third Party Library
- head files
- lib files
- dynamic lib
.so
- static lib
.a
- dynamic lib
gcc 命令参数
-I INCLUDE_DIRECTORY
head files 绝对路径 e.g.-I/usr/include/
-l LIB_NAME
e.g. math 的libm.so,-lm
-L LIB_DERECTORY
e.g.-L/usr/lib/
- 静态链接参数
-static
优先使用static lib,默认优先使用dyncmic lib
e.g. 在/usr/local/opt/llvm/lib
目录下,同时存在库文件libunwind.so
和libunwind.a
。 为了让gcc在链接时使用静态链接库文件libunwind.a
,我们可以添加-static
参数, - 优化参数
-O0
、-O1
、-O2
、-O3
-O0
参数表示不使用任何优化策略,是gcc默认的优化参数。-O1
会尽量采用一些不影响编译速度的优化策略,降低生成的二进制文件的大小,以及提高程序执行的速度。-O2
使用-O1
中的所有优化策划,还会采用一些会降低编译速度的优化策略,以提高程序的执行速度-O3
在-O2
的基础上,使用更多的优化策略。这些额外的优化策略会进一步降低编译速度,而且会增加生成的二进制文件的大小,但程序的执行速度则会进一步提高。-Os
则和-O3
优化的方向相反。它在-O2
的基础上,采用额外的优化策略,尽量的降低生成的二进制文件的大小。
- 宏相关参数
-Dmacro
定义宏macro,默认将其定义为1,相当于在程序源码中使用#define macro
语句。-Dmacro=def
定义宏macro为def,相当于在程序源码中使用#define macro=def
语句。-Umacro
取消宏macro的定义,相当于在程序源码中使用#undef macro
语句。-undef
取消所有非标准宏的定义
- 其他
-std
使用c++标准,-std=c++11
-std=c99
-ansi
一般等同于-std=c90
-Werror
要求gcc将产生的警告(Warning)当成错误(Error)进行显示-Wall
显示出尽可能多的警告信息-w
不显示警告信息-wl
将后面跟随的参数传递给链接器ld
-v
显示gcc编译过程中一些额外输出信息。
Demo
#include <bits/stdc++.h>
using namespace std;
int main(int argc, char** argv) {
map<int, unordered_set<int>> m;
if (m[5].count(6)) {
cout << "find\n";
} else {
cout << "not exist\n";
}
return 0;
}
gcc main.cc -std=c++11 -lstdc++ -L/usr/lib32/ -I/usr/include/c++/5 -o main
./main
# or
g++ main.cc -std=c++11
./main