Linux c 开发 - gcc

来源:互联网 发布:支持java的游戏引擎 编辑:程序博客网 时间:2024/06/13 02:57

gcc是linux下的一种编译器。c语言通常都是通过gcc进行编译而成。

一般gcc的编译过程如下图:

我们从最简单的例子开始讲解gcc的一些使用方法。后面我们会具体讲解每一个编译步骤如何来编译的。


常用文件:

.o 文件:linux下的c语言目标文件

.a文件:linux下的静态连接库,相当于多个.o合起来。静态链接库在编译的时候加载生成目标文件,而在运行的时候不用加载库,对库没有依赖性。

.so文件:linux动态链接库。在目标文件运行时加载,手动加载,且对库有依赖性。


1. gcc直接编译

看一个最简单的hello world的例子:

#include <stdio.h>#include <stdlib.h>#include <stdio.h>int main() {        printf("Hello World\n");        return 0;}
我们执行命令:

gcc main.c

[admin@localhost c]$ gcc main.c[admin@localhost c]$ lsa.out  main.c[admin@localhost c]$ 

可以看到多了一个a.out的文件,a.out是一个可执行的文件,我们可以执行一下可以看到输出了"hello world":

[admin@localhost c]$ ./a.out Hello World

每次生成a.out文件会有些不好玩,我们可以通过下面的命令可以将a.out重命名为我们自己想要的文件名称:

gcc main.c -o main //通过-o命令可以重命名

[admin@localhost c]$ gcc main.c -o main[admin@localhost c]$ lsmain  main.c[admin@localhost c]$ 

这个时候再执行./main这个文件:

[admin@localhost c]$ ./main Hello World[admin@localhost c]$ 



2. gcc预处理

gcc编译过程可以看到最上面的图中有四个步骤:预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编 (Assembly)和连接(Linking)。

我们需要对我们上面那段main.c进行预处理:

gcc -E main.c -o main.i

这个时候你就能看到文件目录下面多了一个test.i的文件,test.i的文件中可以看到编译器预处理的结果,是将include的内容合并到了test.i文件中。

[admin@localhost c]$ gcc -E main.c -o main.i[admin@localhost c]$ lsmain.c  mian.i


3. gcc编译为汇编代码

预处理之后,会生成main.i文件,我们对这个文件进行编译成汇编代码

gcc -S main.i -o main.s //-S是进程编译成汇编代码

这个时候多了一个main.s的文件,就是进行编译成汇编的文件

[admin@localhost c]$ gcc -S main.i -o main.s[admin@localhost c]$ lsmain.c  main.i  main.s

4. gcc汇编

生成main.s的汇编代码之后,我们需要将汇编代码进行汇编的处理。生成main.o的文件

gcc -c main.s -o main.o //-c是进行汇编
[admin@localhost c]$ gcc -c main.s -o main.o[admin@localhost c]$ lsmain.c  main.i  main.o  main.s


4. gcc连接

最近将生成的main.o文件连接起来生成最终的可执行文件。

gcc main.o -o main //生成main可执行文件
[admin@localhost c]$ gcc main.o -o main[admin@localhost c]$ lsmain  main.c  main.i  main.o  main.s


4. gcc多个文件的编译

我们新增了一个test.h和test.c的文件,并且在main.c中调用了test.c中的方法,这个时候我们需要进行多个文件的编译。

test.h

#include <stdio.h>#include <stdlib.h>void test();


test.c

#include "test.h"void test() {        printf("Hello World\n");}

main.c

#include <stdio.h>#include <stdlib.h>#include "test.h"int main() {        test();        printf("Hello World\n");        return 0;}

编译命令:

gcc test.c main.c -o main

或者

[admin@localhost c]$ gcc -c test.c -o test.o[admin@localhost c]$ gcc -c main.c -o main.o[admin@localhost c]$ gcc test.o main.o -o main[admin@localhost c]$ ./main Hello WorldHello World

7. 编译的时候提示警告信息

可以通过-Wall命令来提示编译过程中的警告信息,对代码调试之类有帮助

gcc main.c -o main -Wall

8. 指定查找路径

如果我们上面这个例子的头文件放进cc/这个文件夹里面,这个时候main.c中需要下面的命令才能找到这个头文件。

命令:

gcc -I cc/  -c main.c -o main.o

9. 连接库文件

假如我们要连接线程的库文件,可以使用下面的命令

gcc main.c -o main -l pthread


1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 绿箩化肥施多了怎么办 辣椒化肥施多了怎么办? 化肥施多了烧苗怎么办 绿植施肥施多了怎么办 盆栽肥料放多了怎么办 三环复合肥怎么办啊 母猪下崽后不吃食怎么办 猪自配料料槽不下怎么办 美甲边缘起翘怎么办 猪粪流到鱼塘里鱼死了怎么办啊 在基本农田建有机肥厂怎么办 有机肥厂的环评怎么办 织玻璃纤维网布环评怎么办 吃了受潮的奶粉怎么办 喝了受潮的奶粉怎么办 刚买的奶粉受潮怎么办 羊不小心吃了化肥怎么办 阿胶粉结成块了怎么办 半桶奶粉受潮了怎么办 眉粉受潮了结块怎么办 刚买的奶粉结块怎么办 袋装白糖成坨了怎么办 一袋子白糖硬了怎么办 粉饼上有一层油怎么办 葡萄后期氮肥施用过多怎么办 没洗的菜吃了怎么办 闻了汽油味头晕怎么办 碰到绿萝的汁液怎么办 吃了带农药水果怎么办 开槽模切一体机模切时开槽怎么办 柔版印刷走纸歪斜怎么办 美团外卖一天8单怎么办 单位显示器丢了怎么办员工赔 纸板板门起泡了怎么办 卖家要我开出质量问题证明怎么办 闲鱼买到的商品不符合描述怎么办 寄出去的东西碎了怎么办 闲鱼快递损坏了怎么办 寄快递东西坏了怎么办 快递邮寄东西坏了怎么办 快递被别人拆了怎么办