gcc和g++编译器
gcc和g++编译器
gcc/g++使用
预处理(宏替换) -> 编译(编译成汇编) -> 汇编(翻译成机器码) -> 链接(生成可执行文件或库文件)
1 | gcc [option] src (-o dst) (-DM) |
在默认情况下,直接对源文件gcc会生成a.out文件
-o后面紧跟着生成的目标文件
.o文件叫可重定位的目标文件,也就是在windows中vs下的.obj文件,是二进制文件,此时没有连接库
在没有使用第三方库的情况下,直接对.o文件使用gcc即可完成连接,生成可执行程序
-D可以为编译中的程序进行命令行级别的宏定义,例如此处添加了宏M
[option]
-E 在预处理后停止,生成.i文件
-S 在编译后停止,生成.s文件
-c 在汇编后停止,生成.o文件
命令尾加上-g表示为可执行程序添加调试信息,即debug模式
命令尾加上-std=c99,表示用c99标准编译
项目中常见操作是将多个源文件编译成.o文件,再统一编译为一个可执行文件
ldd 命令可以查看可执行程序依赖哪些库
gcc编译代码时默认为动态链接
如果需要静态链接编译,需要在命令尾部加上-static
库
- 动态库:linux(.so) windows(.dll)
- 静态库:linux(.a) windows(.lib)
linux中库的命名规则是 lib库名.so(或a)
动静态库对比:
1. 动态库形成的可执行程序体积一定很小
1. 可执行程序对静态库的依赖小,不能缺失动态库\
1. 程序运行时,静态链接的会在内存中产生大量重复代码
1. 动态链接省内存和磁盘资源
动态库保证在语言层面的公共代码,未来在内存中只会出现一份
动静态库的本质是一个被打包的.o文件
链接的本质是将所有的.o合并
file 命令可以用于查看具体可执行程序的信息