什么是链接?对于初学C语言的朋友,可能对 我们的C代码编译生成可执行程序会经过如下过程: 链接就是把目标文件与一些库文件生成可执行文件的一个过程。关于更详细的编译过程,可查阅往期笔记:【本质】你知道C语言编译的过程吗? 静态、动态链接?1、什么是静态链接? 静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。 链接器是一个独立程序,将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一块生成可执行程序。 这里的库指的是静态链接库,Windows下以.lib为后缀,Linux下以.a为后缀。 2、什么是动态链接? 动态链接( 这里的库指的是动态链接库,Windows下以.dll为后缀,Linux下以.so为后缀。 值得一提的是,在Windows下的动态链接也可以用到.lib为后缀的文件,但这里的.lib文件叫做导入库,是由.dll文件生成的。 3、静态链接与动态链接的优缺点? (1)静态链接的优缺点: 优点:
缺点:
(2)动态链接的优缺点: 优点:
缺点:
静态、动态链接实验下面的实验基于Windows平台。Windows下的静态链接、动态链接实验网上较多的是使用一些IDE如 本篇笔记我们不使用IDE,而是以Windows平台搭配 我们先编写如下代码(共三个文件): 文件1(main.c): #include "test.h" 文件2(test.c): #include "test.h" 文件3(test.h): #ifndef __TEST_H 此时我们的代码目录如下: 1、静态链接实验 进入我们的代码路径,输入命令: gcc -c test.c main.c 编译、汇编指定的源文件(也就是编译源文件),将每一个源文件编译成对应的目标文件。此时文件夹下多出了 接下来使用 ar rv lib_test.lib test.o main.o 其实,用MinGW可以生成.a后缀和.lib后缀的静态链接库,这里生成的是.lib后缀的静态库。此时文件夹下多出了.lib文件: 然后把这个静态库链接成可执行文件
此时文件夹下多出了可执行文件 双击运行: 可见,运行结果与预期一致,说明我们使用静态链接的方式生成的可执行文件没问题。 这个可执行文件的运行并不依赖于 2、动态链接实验 我们把 gcc test.c -shared -o dll_test.dll 此时文件夹下多出了动态库文件 我们用该动态库文件 gcc dll_test.dll main.c -o dll_test.exe 此时文件夹下多出了可执行文件 双击运行: 可见,运行结果与预期一致,说明我们使用动态链接的方式生成的可执行文件没问题。 这个可执行文件的运行依赖于 那是因为使用动态链接库的应用程序不是自完备的,它依赖的DLL模块也要存在。 动态链接的方式使用得很广泛,比如我们电脑系统盘的 腾讯QQ安装目录下: 上面使用的命令其实与Linux下操作的命令大多都很相似,我们只要明白这么一回事就可以很快地在Linux下进行操作。 |
|