c#生成静态库_一篇搞定对Linux下静态库和动态库的理解

我们在工作中经常会看到xx.a和xx.so这样的文件,那么这是什么呢?又有什么作用呢?这篇我们就可以很好的认识并熟练的使用他们。

点开这首音乐,我们开始进入正题。

一、c语言编译流程

  • 预处理
  • 编译
  • 汇编
  • 链接

我们知道c语言编译器gcc,那么我们下面就看下gcc的主要语法,如下:

man gcc我们可以知道

-E:Preprocess only; do not compile, assemble or link;只预处理,不会编译、汇编、链接

-S:Compile only; do not assemble or link;只编译,不会汇编、链接

-c:Compile and assemble, but do not link; 编译和汇编,不会链接

-o:Place the output into ;指定输出文件名为file

-v:查看gcc编译器的版本,显示gcc执行时的详细过程

# 源文件是hell.c预处理:gcc hello.c -E -o hello.i编译:gcc hello.i -S -o hello.s汇编:gcc hello.s -c -o hello.o链接:gcc hello.o -o hello
1a361887acaf18f7adb96f6745d7dc6f.png

预处理、编译、汇编、链接

预处理阶段:

7cf2674a748bd4376122421f3438806b.png

预处理:头文件包含、宏替换、条件编译

编译阶段:

573efe4ce94c7c181e57ec5d5c016ad1.png

编译生成的汇编代码

汇编阶段:

汇编代码转换机器码,这个阶段我们就不考虑了。

链接阶段:

动态链接或者静态链接生成可执行程序

二、动态链接与静态链接

静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。链接器是一个独立程序,将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一块生成可执行程序。静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。

动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的DLL之间建立链接关系。当要执行所调用DLL中的函数时,根据链接产生的重定位信息,Windows才转去执行DLL中相应的函数代码。

a443af0412e897f3d94739ee3c311186.png

静态链接、动态链接

三、静态库与动态库制作

# hello.c hello.h test.c test.h# hello.c#include#include"hello.h"#include"test.h"#define M#ifdef M#define N 50#if N>20void hell(){printf("hello");}#else#define n 20#endif#endifint main(){test();test1();hell();printf("hello world:%d %d",N,a);return 0;}  #hello.h  int a = 666;  #test.c  #include#include"test.h"void test(){printf("hello");}void test1(){printf("hello");}#test.hvoid test();void test1();

制作:

# 生成test.ogcc -c test.c  ar -cr libtest1.a test.o  #静态库制作gcc -shared -fpic -o libtest2.so test.c  #动态库制作gcc -o hello hello.c -L. -ltest1gcc -o hello hello.c -static -L. -ltest1gcc -o hello hello.c -L. -ltest2gcc -o hello hello.c -static -L. -ltest2  #错误
984f65a8e662bac5a8d3b5a0e99c7644.png
3d7e7228e2ca94758d3a43372bb6b511.png

这里发现了动态生成的文件的确比较小。静态库支持动态链接和静态链接?动态库只支持默认的动态链接?

test@DESKTOP-AR8TSM0:~$ ll libtest1.a libtest2.so -rw-rw-r-- 1 test test 1832 Mar 25 18:07 libtest1.a-rwxrwxr-x 1 test test 7928 Mar 25 18:14 libtest2.so*#这里看出来动态库比静态库大

先到这里了。如有出错,请指正,喜欢的给点个赞谢谢!

542e8b2bad7ed6a0dba4cc3bb6d087fd.gif

谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值