GCC编译器的使用

文章目录

    • 1.拆解gcc -o hello hello.c命令
    • 2.分步手工执行命令进行编译链接
    • 3.编译多个文件

1.拆解gcc -o hello hello.c命令

mian.c在预处理后生成的main.i(Intermediate file)文件是中间文件,编译后产生的main.s(Assemble file)是汇编代码文件,几个汇编文件汇编之后产生的main.o(Object file)叫做目标文件,目标文件是机器码文件(二进制代码),众多机器码文件链接成一个可执行程序(a.out)。
GCC编译器的使用_第1张图片
用命令 gcc -o hello hello.c可以一条命令执行四个步骤,得到可执行程序,可以用gcc -o hello hello.c -v查看详细过程,如下:
这里用cc1命令将.c文件转化为临时目录下的.s文件,这一步做了预处理和编译两个步骤,预处理时会先查找头文件,并展开宏。
在这里插入图片描述
这里用as命令将.s文件转化为.o文件,这个过程称为汇编,将汇编码转化为机器码。
在这里插入图片描述
这里用collect2来将几个目标文件和库文件等链接成可执行文件。
GCC编译器的使用_第2张图片

2.分步手工执行命令进行编译链接

以下是hello.c文件
GCC编译器的使用_第3张图片

1.预处理:使用gcc -E -o hello.i hello.c来生成中间文件hello.i,一下时hello.i文件内容,这里表明hello.c需要包含什么头文件,以及指明头文件在什么目录
GCC编译器的使用_第4张图片
在.i文件中用/main搜索定位main,可以发现宏已经被展开
GCC编译器的使用_第5张图片
2.编译:使用gcc -S -o hello.s hello.i命令来编译.i文件,生成汇编文件,查看文件可以发现,临时文件已转化为汇编文件。
GCC编译器的使用_第6张图片

3.汇编:使用gcc -c -o hello.o hello.s将目标文件汇编起来成目标文件,生成机器码。

4.链接:使用gcc -o hello hello.o生成应用程序。

3.编译多个文件

用命令"gcc -o test main.c sub.c"一起编译、链接。
该命令分别编译两个源文件,生成两个目标文件,最后会将这两个目标文件和其他库文件链接起来得到应用程序。
要想编译更多的文件,就在该命令后面添加源文件的文件名。
附:下表为GCC常用编译选项。
GCC编译器的使用_第7张图片
下图中用-I来指定链接的时候头文件在 ./目录。若不含-I,则在工具链指定的目录下找头文件。
在这里插入图片描述
对于静态库libxxx.a,用-L 来指定链接的时候静态库的路径,若不含-L则在工具链指定的目录下寻找。
在这里插入图片描述
而动态库则不行,因为动态库在编译的时候并没有链接在一起,而是运行的时候才调用。
要想成功运行,则需要用命令export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./ 来让编译器在运行的时候先去D_LIBRARY_PATH:(原来的路径)下查找,再去./下查找,若存在,则动态链接,运行。

参考文章
1.嵌入式Linux应用开发完全手册V5_IMX6ULL_pro开发板
2.https://blog.csdn.net/Hit_By_Apple/article/details/128187457

参考视频:
https://www.bilibili.com/video/BV1kk4y117Tu?p=4&share_source=copy_web

你可能感兴趣的:(linux)