gcc编译C/C++文件

C/C++文件的编译

众所周知,C/C++程序想要得到执行,主要需要执行编译和链接两个过程,这个过程比较繁琐,尤其是程序使用到了其他的头文件的时候。gcc是常用的编译工具,其流程主要是预处理、编译、汇编、链接。

C语言编译和链接

1、单个程序下的编译过程

编写一个经典的helloworld程序,vi创建程序文件名hello.c,代码如下截图:

image

接下来对hello.c源代码进行编译及生成可执行代码。

第一步,使用gcc对源文件进行编译,生成目标代码(形如xxx.o),参照下面的截图。

gcc -c hello.c
-c :编译或汇编源文件,输出obj文件

第二步,使用gcc链接xxx.o,生成可执行文件

gcc -o hello hello.o
-o:生成可执行文件,其后可以是hello.c/hello.o(源文件/目标文件)。
如果不使用-o,默认生成a.out

image

这种单个文件的编译及运行非常简单,自己动手试一下就能理解了。

2、包含头文件的编译

创建cpptest目录并进入,分别创建一个include和src路径用于存放头文件和源代码。

第一步,先进入include目录,创建一个头文件hello.h及它的实现代码hello.c。

image

第二步,进入src目录下创建main.c程序,该程序调用hello.h的hello方法。

image

此时,如果我们还是按照第1章节中的方法执行main.c,肯定是报错的。

image

因为对于生成的可执行文件来说,它不知道hello.h头文件所在的位置,所以#include的时候就中止编译了。现在来引入gcc的另一个参数-I(大写的i)。

-I :该参数选项指定路径让编译器去相应的路径查找头文件

现在我们指定hello.h的所在位置,看看程序是否能成功编译

image

可以发现,没有报“fatal error:hello.h:No such file or directory”这个错误了,说明include找到了hello.h这个头文件,但是随之而来又出现了一个新的报错,显示没有定义引用“hello”,意思就是没有定义hello()函数呗。因为我们只是在hello.h头文件里声明了hello(),并没有定义函数体,关于为什么只在头文件里声明函数名而不对其实现,主要是C语言的模块化设计中.h头文件主要是对外的一些接口,一些私有的数据等等实现都会封装在我们的.c中。在这个例子里,如果把hello.c文件里实现的程序直接写在hello.h里,就可以编译成功获取到可执行文件。


前面的hello.h声明函数和hello.c实现函数这种方式,常常用于生成和使用库文件。

库文件和头文件的作用类似,提供大量的模块/函数。但其实两者并不能混为一谈,它们之间最大的区别是:

  • 头文件主要用于变量声明和存储、函数/类等功能模块的声明
  • 库文件主要负责模块的具体实现

库文件又有静态链接库和动态链接库的分别,这里就简要介绍一下。

3、生成静态链接库及使用

在linux中,静态链接库文件通常是形如libxxx.a的文件,xxx一般是xxx.h头文件的名字;在windows中,静态链接库文件是xxx.lib。

先使用gcc命令编译hello.c文件,再使用ar命令生成静态库文件,如下截图。这样就完成了静态库libhello.o的创建。接下来就是把main.c程序链接到库,生成一个可执行文件,运行可执行文件main,打印结果。
1.单个目标文件生成静态库

ar (-)crs libhello.a hello.o
-c :创建备存文件
-r :把xx文件插入备存文件中(默认替换)
-s :若备存文件中包含了对象模式,可利用此参数建立备存文件的符号表

gcc -o main main.c -I ../include -L ../include -l hello
-L:指定一个目录,用于编译过程中搜索,即指定库文件的路径
-l(小写L):根据参数后的库名查找链接的库文件,搜索几个系统目录以及-L指定的目录

image
  1. 多个目标文件生成静态库
    在include目录下新建一个add2int函数,实现两个整数的加法,并在main.c程序中调用。


    图片.png

    将hello.o和add.o链接到一个静态库libhelloAndadd.a中
    图片.png

4、生成动态链接库及使用

动态链接库,顾名思义,

在linux中,动态链接库文件通常是形如libxxx.so的文件;在windows中,动态链接库文件是xxx.dll。(命名规则和静态链接库是一样的,只是后缀不同)
生成动态链接库的命令与静态链接库稍有不同,需要使用gcc的-fPIC(或-fpic)、-shared参数。
1.单个源文件/目标文件生成动态库

gcc -fPIC -shared hello.c -o libhello.so
-fPIC(-fpic):生成posotion-independent code(PIC),在共享库中使用
-shared:创建一个共享对象,能够链接到其他对象文件,完成执行
//gcc -fPIC -shared hello.o -o libhello.so --目标文件(xxx.o)

可以看到链接了libhello.so文件仍然显示找不到,这需要把.so文件拷贝到/usr/lib等目录下,就可以运行了

图片.png

或者以这种形式执行
图片.png

2.多个源文件/目标文件生成动态库
其实类比多个目标文件生成静态链接库,把ar命令替换成gcc -fPIC -share xxx.o -o libxxx.so,然后将动态链接库文件拷贝到/usr/lib目录下,生成可执行文件即可正常调用。
图片.png

* 扩展

静态链接库和动态链接库的区别
makefile生成链接库文件
cmake生成链接库文件

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容