动态库与静态库

gcc & g++的区别

     gcc 默认链接 C 库 —》 libc gcc 编译 C++(.CPP) 文件 gcc -o main main.cpp -lstdc++
     g++ 默认链接 C++ 库 —》 libstdc++ g++ 编译 C 语言(.c)没有任何问题

库文件

libstdc++ libc —》printf strcpy fopen add
     提前写好某些功能实现的集合 --》 .h 文件 函数的声明
     库文件是提供给用户使用的,不能单独执行
     实现库文件时,都必须没有 main 函数

静态库和共享库的区别
静态库文件 windows:.lib linux: .a
     程序使用静态库是在链接阶段使用,链接器从库文件取得所需的代码,合并到最终的可执行文件中。在链接阶段复制代码,和程序的执行过程无关

共享库文件 windows:.dll linux: .so
    动态库      不能单独执行的可执行文件
     程序使用共享库是在运行阶段被系统动态加载到内存当中供程序使用。链接阶段只是给最终的可执行文件声明所使用韩式在那个动态库中,并且重定位。运行阶段共享库会被单独加载到内存上执行

     静态库的可执行文件当中包含了库代码的一份完整的拷贝,因此,当它被多次使用时就会有多份没用的拷贝在内存当中,所以比较占内存;而动态库系统只需载入一次动态库,不同的程序可以得到内存当中相同的动态库的副本,因此会节省很多内存。

静态库与共享库的生成与使用

静态库:my_math.c my_math.h
     1、gcc -c *.c
          将 .c 文件编译成 .o 文件,不包含有main函数的文件
     2、使用 ar 将目标文件归档
          ar crv libxxxx.a *.out
          libxxxx.a 即创建的静态库
     3、使用:gcc -o main mian.c list.c -L(库的路径) -l(库的名称)
           gcc -o main mian.c list.c 库的路径/库的名称(全名)

共享库:my_math.c my_math.h
     1、gcc -fPIC -shared -o libxxx.so *.c
     2、等价于 1 :gcc -c -fPIC *.c
          gcc -shared -fPIC -o libxxxx.so *.c 不包含有 main 函数的文件
          libxxxx.so 即共享库

链接库文件

     gcc -o main mina.c list.c -L(库的路径) -l(库的名称)
           gcc -o main mian.c list.c 库的路径/库的名称(全名)

     -L -l 仅仅是给 gcc 指明库的路径及库名
    操作系统单独加载动态库时,还需要知道库的路径(去哪个位置找加载的库)

环境变量:LD_LIBRARY_PATH 给操作系统指定加载库的路径
操作系统默认去 /lib  /usr/lib 路径下找库文件

程序执行时,使得操作系统加载共享库的方法:
    1、将共享库拷贝到 /lib   /usr/lib —》root用户
    2、给环境变量设置寻找库的路径(绝对路径)
设置 LD_LIBRARY_PATH 的方式:
     1、直接在终端上操作 export LD_LIBRARY_PATH = 绝对路径 仅对当前终端有效
     2、直接修改配置文件 LD_LIBRARY_PATH 对 c 任何一个终端有效
         ~/.bashrc 编辑:
         export  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/stu/lib:.
        source ~/.bashrc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值