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 命令可以用于查看具体可执行程序的信息