文章目录
参考博客
本文参考/copy了如下博客的内容,自己参考进行了些补充,支持原创:
以下文中与上面有相关联部分会用上标标识,更多信息会在原文中出现。
一、程序编译到执行文件过程1,2
编译过程
c/cpp首先会被编译成中间代码文件,win下为.obj文件,Unix/Linux下为.o文件,这个过程称为编译。
编译器在编译过程会进行语法检查,包括源文件语法的正确和函数与变量声明的准确。只要通过语法检查,就会生成.o文件。
链接过程
中间代码文件合成执行文件称为链接。
链接时主要是链接函数和全局变量,也就是将中间/目标文件链接生成可执行的应用程序,链接器只会去把.o文件进行链接。
不过在很多时候由于源文件太多,生成的.o文件也就会很多,这个时候难以编译,解决方法是将.o文件打包,windows下打包成库文件/lib,Linux下打包为归档/archive文件,.a文件。
二、我们需要理解的编译器内容
GCC、G++、GDB
GCC是用于对C语言进行编译,G++是CPP的编译器,GDB是调试工具。
这里主要介绍GCC的功能。
GCC 选项
我们或许可以看到一个较为复杂的gcc类似如下形式:
gcc -o main aa.c xx.o x2.o ar.a -lpthread -L /home/xxx/xx -I /home/xxx/xxhead
编译相关选项
- -c: 编译,生成.o文件
- -o: 生成可执行文件
GCC添加库依赖(-l 和 -L)
- -l: 依赖/usr/lib中的库,例如需要使用到
libpthread.so
的时候,就使用-lpthread即可。 - -L:大L的区别在于使用自己生成的库,可以制定路径。使用的时候-l不需要空格,大L需要空格。
GCC添加头部依赖(-I)
当程序提示找不到相关头文件,找不到函数或者全局变量的时候,这个时候需要添加头文件位置,于是就可以使用-I directory。
更多内容可以访问gcc -I -L -l区别4
GDB 生成调试信息注意
调试程序需要有调试信息,调试信息自然是与源文件有关,所以为了让gdb能够成功读取符号表,需要在编译过程加上-g的选项: