c语言编码详解动态链接与静态链接的区别

最近在面试一些公司,发现自己的一些基础的知识可能需要补充,特此来记录一下自己的学习心得。学习,学习,学在于习,只学,不习,空谈也,最终都会遗失在时间长河中。记录,记录,仅仅是记录,不求完美,只求简单分享,作为一个思考的过程。

以下需要用到3个文件

hello.c hello.h lib_use.c,hello.c提供一个打印函数的实现,hello.h提供打印函数的接口,lib_use.c为主程序,调用打印函数打印一个字符串。代码在c语言编码实现编译全过程分析 ,可以参考 Makefile中进行编译。

1 程序编译的过程

        程序编译一般分为以下几个阶段:

                预处理-->编译-->汇编-->链接

                预处理主要负责将程序中的#include 和 宏定义和条件编译展开,生成*.i 预处理文件,属于词法分析阶段,为后续做准备。

                编译主要负责将预处理生成的*.i文件编译翻译成汇编文件*.s 。

                汇编主要负责将编译生成的*.s文件汇编处理成目标文件*.o。

                链接主要负责将生成的*.o和含有主函数的源文件,以及一些库文件,链接成可执行文件;链接分为动态链接和静态链接,一般默认使用动态链接,使用静态链接,需要加-static 来告知编译器。

        c语言编码详解动态链接与静态链接的区别_第1张图片

2 静态链接和动态链接

2.1 静态库和动态库

        静态链接需要静态库,静态库在Linux下格式是*.a,在Windows下是*.lib。

        动态链接需要动态库,动态库在Linux下格式是*.so,在Windows下是*.dll。

2.2 Linux下静态库和动态库的制作

        静态库的制作:

                ar -crv libhello.a hello.o

        动态库的制作:

                ar -crv libhello.so hello.o

2.3 Linux下静态链接和动态链接的实现

        静态链接:

                gcc libuse.c -static -I${HELLO_H} -L${sta_libs+path} -lhello -o libuse_sta

        动态链接:

                gcc libuse.c -I${HELLO_H} -L${dyn_libs+path} -lhello -o libuse_dyn

2.4 静态链接和动态链接的区分

        静态链接是在编译链接时直接将需要的执行代码拷贝到调用处;优点在于程序在发布时不需要依赖库,可以独立执行,缺点在于可执行程序的体积会相对较大,而且如果静态库更新之后,所有的可执行程序都需要更新。

        动态链接是在编译时不直接拷贝执行代码,而是通过记录一系列符号和参数,在程序运行或加载时将这些信息传递给操作系统,操作系统负责将需要的动态库加载到内存中,然后程序在运行到指定代码时,在共享执行内存中寻找已经加载的动态库可执行代码,实现运行时链接;优点在于多个程序可以共享同一个动态库,节省资源;缺点在于由于运行时加载,可能影响程序的前期执行性能,并且对于不同版本的库可能会有不能运行的情况。

你可能感兴趣的:(C++精进之路,c语言,开发语言,1024程序员节)