标签:下载 一个 目录 很多 source blog 主程 文件内容 so文件
转自:https://www.cnblogs.com/ggjucheng/archive/2011/12/14/2287738.html
https://www.cnblogs.com/fengliu-/p/10219850.html
https://blog.csdn.net/m1223853767/article/details/79464729
gcc能够编译多种语言,不仅仅是C,使用man gcc查看说明时:
还支持OC等语言。
编译成为可执行文件分为四个阶段:预处理、编译、汇编、链接。
gcc [options] [filenames]
常用选项:
-c
只编译,不链接成为可执行文件。
编译器只是由输入的 .c 等源代码文件生成 .o 为后缀的目标文件,通常用于编译不包含主程序的子程序文件。
-o output_filename
确定输出文件的名称为output_filename。
同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出默认的可执行文件 filename.out 。
-g
产生符号调试工具(GNU的 gdb)所必要的符号信息。
-Idirname
将 dirname 所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。
一步到位:
gcc test.c -o test
gcc -E test.c -o test.i 或 gcc -E test.c
-E
预编译后停下来,生成后缀为 .i 的预编译文件。查看test.i文件内容,内容非常长,只截取了一部分:
存放的是.c文件预处理之后的代码。在本例中,是将stdio.h头文件中的内容插入(不是复制?)了进来。
gcc -S test.i -o test.s
-S
汇编后停下来,生成后缀为 .s 的汇编源文件。查看.s文件内容,生成了汇编代码:
gcc -c test.s -o test.o
-c
编译后停下来,生成后缀为 .o 的目标文件。cat命令查看.o文件时乱码的,它是一个二进制的文件吧。
gcc test.o -o test
gcc连接器是gas提供的,负责将程序的目标文件与所需的所有附加的目标文件连接起来,最终生成可执行文件。
附加的目标文件包括静态连接库(.a结尾)和动态连接库(.so结尾)。区别仅在于程序执行时所需的代码是在运行时动态加载的,还是在编译时静态加载的。
函数库实际上就是一些头文件(.h)和库文件(.so 或 .a)的集合。
一般来说,默认将头文件放到 /usr/include/ 目录下,而库文件则放到 /usr/lib/ 目录下。
/usr/include/目录内容,包含很多.h头文件:
/usr/lib/ 目录内容,包含很多库文件:
但gcc仍需自己的方法来查找所需的头文件和库文件:
gcc source_file.c -L /XXX/lib -l libXXX.a -I /XXX/include
假设test.c在linux上使用c连接mysql,需要去mysql官网下载MySQL Connectors的C库,解压之后,有一个include文件夹,里面包含mysql connectors的头文件,还有一个lib文件夹,里面包含二进制so文件libmysqlclient.so
gcc –c –I /usr/dev/mysql/include test.c –o test.o
gcc –L /usr/dev/mysql/lib –lmysqlclient test.o –o test
也可以强制使用静态链接库。
标签:下载 一个 目录 很多 source blog 主程 文件内容 so文件
原文地址:https://www.cnblogs.com/BlueBlueSea/p/14319220.html