美文网首页
C动态链接与静态链接

C动态链接与静态链接

作者: Trump丶 | 来源:发表于2019-06-02 09:49 被阅读0次

个人很看重编译和链接这层的东西,简单谈一谈C语言的动态链接和静态链接

动态链接

简介

在做程序开发的时候,有许多简单的函数是很常用的,但是如果每个程序都把这些很常用的函数的实现包含在内的话,就会占用很多空间

有一个很好的办法,把这些常用的函数实现提取成单独的文件(动态链接库),放在某个地方,一个程序需要使用某个函数的时候再去加载对应的库,这样就能节省很多空间

示例

// main.c![1553306805246.jpg](https://img.haomeiwen.com/i11850278/1d763cd2c7d3f022.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

void hello();
int main()
{
    hello();
    return 0;
}
// hello.c
#include <stdio.h>

void hello()
{
    printf("Hello World from hello.c\n");
}

编译测试一下
gcc main.c hello.c -o main && ./main

正常输出,没毛病

接下来将hello.c编译成动态链接库试一试
gcc hello.c -shared -o libhello.so

可以看到编译出了libhello.so

接下来编译main.c,并且制定使用libhello这个库,在当前目录查找库文件
gcc main.c -lhello -L. -o main

运行一下试试

没毛病

试试把libhello.so的名字改了,或者移动到其他地方,让main找不到动态库

可以看到,程序的确找不到库了,不能正常输出

可以很明确的看出,程序是在运行时动态加载libhello.so库的,如果这个库被移动或者改名了,程序就不能正常运行

用ldd命令看看动态库的依赖
ldd ./main

可以看到这个程序的几个动态依赖

静态链接

简介

静态链接就是直接把所有运行时需要的库,全部包含进程序中,打包在一起,这样就不管外面的库怎么移动怎么改名怎么缺少,程序都可以运行

示例

还是之前的代码,将hello.c编译,但是不作链接
gcc -c hello.c -o hello.o && ll

生成的hello.o

再把hello.o打包成静态库文件
ar -r libhello.a hello.o && ll

生成的静态库文件

再来编译main.c并且把libhello.a静态链接进程序中
gcc main.c -lhello -L. -static -o main_static

运行结果一切正常,并且跟静态库已经没有关系了,删掉静态库程序依然可以运行


可以看出差别在哪

ldd命令看看
ldd ./main_static

哈,不是个动态可执行文件

小结

没有小结,自己看书去!

相关文章

  • C动态链接与静态链接

    个人很看重编译和链接这层的东西,简单谈一谈C语言的动态链接和静态链接 动态链接 简介 在做程序开发的时候,有许多简...

  • 动态链接与静态链接

    什么是静态链接 如何实现静态链接 静态链接的优点与缺点 什么是动态链接 如何实现动态链接 动态链接的优点与缺点 S...

  • 静态链接与动态链接

    我们编写的程序从源码到可执行文件一般经过如下过程: 预处理 编译 汇编 链接 首先,我们以一个.c文件为例看一下每...

  • 操作系统

    • Linux静态链接和动态链接; (转)静态链接和动态链接1、静态链接静态链接方法:#pragma comme...

  • gcc_clang的使用_day93

    编译命令 编译流程 预编译 编译 链接, 动态链接/静态链接 编写文件 add.c clang -g -c ad...

  • C 动态与静态链接库

    C 动态与静态链接库 一、动态库 纯 C 情况下 add.c 文件/* add.c */#include "add...

  • Java 调用本地代码库

    什么是动态链接库 C/C++编译出来的库有两种:静态链接库和动态链接库。 静态库后缀名在Windows上是.lib...

  • 静态编译、动态编译、静态链接、动态链接

    1、静态编译: 静态编译就是编译器在编译可执行文件时,将可执行文件需要调用的部分从对于动态库中提取出来,链接到可执...

  • 动态链接和静态链接

    什么是静态/动态链接 静态链接是指把要调用的函数或过程直接链接到可执行程序中,成为可执行文件的一部分,该文件包含运...

  • 动态链接和静态链接

    几乎在所有的linux发行版上,都存在着一定程度的不兼容问题,如何让自己的程序能尽量多的在发行版上运行?ldd大多...

网友评论

      本文标题:C动态链接与静态链接

      本文链接:https://www.haomeiwen.com/subject/wrvfzftx.html