动态链接和静态链接

    技术2026-01-26  9

    为什么会链接?

    不管是什么语言,都会有代码复用,举个例子:假如A类里面有个Add的方法,B类里面也有个Add的方法,而且他们的方法是一模一样的,程序员会写2次么 ?答案:不会,会抽出一个C类编写Add方法,其他类去调用C类的方法,这样也遇到一个问题:A、B、C类会分别编译成不同文件,而程序执行又是顺序的,他们会互相找不到,程序执行失败。

    链接就是把调用的方法与被调用者链接成一个可顺序执行的文件。

    静态链接(Static Link)

    我们编写的C文件经过编译后会生成xxx.o文件,这个并不是可执行文件,而是目标文件。 当多2个C文件要存在调用关系时候,那就是2个xxx.o文件,他们是不可以执行的,需要经过链接得到一个可执行文件。

    为在Linux下, 可执行文件使用的都是一种叫ELF(Execuatable and Linkable File Format)的文件格式,中 文名字叫可执行与可链接文件格式,这里面不仅存放了编译成的汇编指令,还保留了很多别的数据。 而Windows的可执行文件格式是一种叫作PE(Portable Executable Format)的文件格式。

    动态链接

    上面提到静态链接,也有问题。我们大家都知道C的一个标准库也有1M左右,而我们电脑一般会有几百个或则几千的进程,如果一个程序静态链接一个C库,那么内存几百M甚至几个G没了---------如何办? 我们可不可以让他们在内存中使用一份那?

    这个加载到内存中的共享库会被很多个程序的指令调用到。在Windows下,这些共享库文件就是.dll文件, 也就是Dynamic-Link Libary(DLL,动态链接库)。在Linux下,这些共享库文件就是.so文件,也就是 Shared Object(一般我们也称之为动态链接库)。

    Processed: 0.015, SQL: 9