Linux系统编程静态库和共享库

windows下的dll即是动态链接库;Linux中叫共享库;
企业开发经常会把程序打包成一个库文件,进行整合和管理;
库分为:
    静态库和共享库(又称动态库);
    库是.o文件的打包;
"静态库"是代码的归档,在编译连接时会"复制"这段代码到目标文件中;
    //优点是独立,连接完成后就不再需要静态库,而且速度会稍快;
    //缺点是占用空间太大,修改和维护不方便;
"共享库"在编译连接时会把代码的"地址"放入目标文件中;
    //优点是占用空间小,修改和维护方便;
    //缺点是在程序运行时必须保证能找到共享库,速度稍慢;

企业开发中主流使用共享库(维护方便,占用空间小);

gcc的-static选项可以将系统库以静态的方式连接文件;
    gcc -static 01hello.c -o b.out
使用静态库生成b.out;生成的文件会比较大;

如果gcc -static 01hello.c报错
    /usr/bin/ld: cannot find -lc
    collect2: ld returned 1 exit status
    请首先安装glibc-static;
由于在配置的过程中误删了libc.so导致编译无法进行
    /usr/lib/gcc/i686-redhat-linux/4.4.7/../../../crt1.o: In function `_start':
    (.text+0xc): undefined reference to `__libc_csu_fini'
    /usr/lib/gcc/i686-redhat-linux/4.4.7/../../../crt1.o: In function `_start':
    (.text+0x11): undefined reference to `__libc_csu_init'
    collect2: ld returned 1 exit status
然后拷贝了libc.so到/lib目录;/lib/libc.so的内容如下
/* GNU ld script
   Use the shared library, but some functions are only in
   the static library, so try that secondarily.  */
OUTPUT_FORMAT(elf32-littlearm)
GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a  AS_NEEDED ( /lib/ld-linux.so.3 ) )
结果还是无法编译;于是又执行yum install glibc*和yum reinstall glibc*
问题顺利解决;
以后再设置系统环境的时候一定要小心谨慎,先做好备份,然后不要轻易删除文件;


静态库的创建步骤:
    1.编写源程序02add.c;
    2.编译源程序,生成目标文件(.o);
        gcc -c 02add.c
    3.打包.o文件生成静态库文件.a;
        ar -r 库文件名 所有的.o文件
    静态库文件名的命名规范:以lib开头,以.a结尾,中间放库名;
        ar -r libmylib.a  02add.o //本命令可以创建库文件;

静态库的使用步骤:
    1.编写应用程序02test.c;
    2.编译02test.c,生成目标文件(不连接);
        gcc -c 02test.c
    3.连接静态库文件和02test.o,有三种方法
        3.1直接连接
            gcc 02test.o libmyku.a //不是很专业
        3.2双L连接法 重点
            gcc -l库名 -L库所在的目录 02test.o
            gcc 02test.o -lmylib -L.//位置可以换
        3.3单L连接法 //配置环境变量LIBRARY_PATH
            配置环境变量LIBRARY_PATH,
            导出把库所在目录export LIBRARY_PATH=. //当前目录;
            gcc 02test.o -lmylib
    注意:编写企业代码,需要提供一个库文件和一个头文件;

共享库的创建步骤:
    1.写源程序03add.c,保存退出;
    2.编译生成目标文件.o;
        gcc -c -fpic 03add.c
        /* -fpic不写也是可以的,但不规范 */
    3.生成共享库文件.so
        gcc -shared 03add.o -o libmyku.so
        //共享库的库文件名和静态库一样,有规范,区别就是以.so做后缀
        //有些系统的共享库后缀是.so.整数;

共享库的使用步骤和静态库的使用步骤一样;
    共享库不可以直接运行但可以参与运行;在运行时必须配置环境变量LD_LIBRARY_PATH;export LD_LIBRARY_PATH=. //配置运行时的环境变量;

ldd a.out命令可以查看相关的共享库文件
系统提供了一套API(应用程序编程接口,就是各种函数)可以直接打开共享库文件;
    dlopen()    打开库文件
    dlsym()        从打开的库文件中得到函数
    dlclose()    关闭
    dlerror()    判断是否出错

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值