c语言复习之链接过程简介

本文是基于唐佐林老师的课程的总结

工程中的每个c语言源文件被编译后生产目标文件,这些目标文件如何生成最终的可执行文件?


连接器的主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接


                                                      图1

静态链接

            -由链接器在链接时将库的内容直接加入到可执行程序中



                                                                   图2

LINUX下静态库的创建和使用

    -编译静态库源码:gcc -c lib.c -o lib.o

    -生产静态库文件:ar -q lib.a lib.o

    -使用静态库编译:gcc main.c lib.a -o main.out



这里是创建一个静态库





                                           图3



                                             图4

如图3和图4表示那样,我们将外部的slib.o、slib.c和dlib.c 删除掉,结果还是一样,由此我们可以得出结论,静态链接就是将所有的库文件生成的库文件全部封装到a.out里面去了。

动态链接

     -可执行程序在运行时才动态加载库进行链接

     -库的内容不会进入可执行文件程序当中


                                                                          图5


LINUX下动态库的创建和使用

 -编译动态库源码:gcc -shared dlib.c -o dlib.so

 -使用动态库编译:gcc -main.c -ldl -o main.out

 - 关键系统调用 

              (1)dlopen : 打开动态库文件

              (2)dlsym : 查找动态库中的函数并返回调用地址

              (3)dlclose : 关闭动态库文件



                                                     图6

dlopen是linux c的内容,大家对出现看不懂的话,推荐大家看一本书叫uinx环境高级编程。dlopen可以打开dlib.so的过程,就是将dlib.so加载到内存中。pdlib这个指针就指向那个动态库dlib.so,然后定义两个函数指针,然后判断pdlib指针是否为空,不为空的话,就证明动态库加载成功了,dlsym查找动态库dlib.so中的函数name,下一个如上,然后下面再判断是否真的找到两个函数,找到之后就调用函数。


                                图6

生成动态库dlib.so             ps:这张图里面有一个错误,应该生成dlib.so


                                         图7

编译程序要指明是动态链接,要不然程序会找不到相应的程序


                                        图7

如图7,这是最后的结果


                                      图8

如图8,将库文件删除后,就打不开库文件,说明一个问题,动态链接就是程序运行时,将库文件链接到程序当中。因此动态链接依赖动态库。



链接是指将目标文件最终链接到可执行程序

根据链接方式的不同,链接过程可以分为:

                     -静态链接:目标文件直接链接进入可执行程序

                     -动态链接:在程序启动后才动态加载目标文件



应用:动态链接可以部分更新程序,方便升级

          静态链接适用于一些小程序,放在任何机器上都可以自由的运行

             

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值