zoukankan      html  css  js  c++  java
  • linux 高级编程之库的使用

    一、静态库与动态库

    静态库: .a .lib

    动态库: .so .dll

    差别(静态库中的代码在链接时就已经复制到可执行文件中,执行时不再依赖库,不会自动使用升级后的库,需要重新产生可执行文件。

    动态库代码不在可执行文件中,执行时自动加载,库升级后,可执行文件会自动执行时会自动使用库。还有就是代码量的大小)

    ar -r libstr.a string.o i2str.o 打包

    二、总结:

    静态库:

    产生库:写若干个c文件(函数或者全局变量,不应该有main),编译(gcc -c ),打包成库(ar -r libxxxx.a 若干个.o ),写一个.h文件(函数或者全局变量的声明)

    *多文件:把一个.c 切成多个,#include每个文件里一份,为每个.c写一个.h,存放.c文件中的函数和全局变量的声明。

    产生可执行文件:写c程序,#include 库的头文件,可以使用库里面的函数和变量。gcc xxx.c libxxx.a ,或者 gcc xxx.c -lxxx -L库文件所在目录,或者 设置环境变量LIBRARY_PATH=库文件所在目录,从而省略前者的-L选项。

    执行可执行文件:直接执行可执行文件。

    需要的是 xxx.h 和 libxxx.a 不再需要源码。

    动态库:

    产生库:写若干xxx.c文件, gcc -c xxx.c 文件; gcc -fpic -shared -o libxxx.so xxx.o 文件。写一个.h文件。

    产生可执行文件:写c程序,#include 库的头文件, gcc -c xxx.c ; gcc xxx.o -lxxxx -L库文件目录或者设置环境变量。

    执行可执行文件:先把库文件 libxxx.so复制到 /lib 或者 /usr/lib 中或者 设置环境变量 LD_LIBRARY_PATH=$LD_LIBRARY_PATH,然后执行 ./a.out 即可。如果想永久有效,可以放到 ~/.bashrc 当中,或者放到 /etc/profile 中。

    升级库: 把产生库的过程重复一遍。如果是动态库,可执行文件自动更新,如果是静态库,需要重复产生可执行文件的过程。新的可执行文件使用的才是新库。

    三、分别介绍两种库的使用方法

    静态库的使用:

    下面给出了3种方法:

    1、首先定义 string.c and i2str.c

    分别如下:

    i2str.c

    string.c

    然后,编写 头文件 str.h(就是一些函数的声明)

    2、打包

    编译 string.c 和 i2str.c

    gcc -c string.c

    gcc -c i2str.c

    然后会分别输出 string.o and i2str.o

    再然后就是打包工作了。

    ar -r libstr.a string.o i2str.o

    3、打完包之后,就可以使用了

    编写usestr.c 程序

    对于用户编写的库文件,需要加上 #include "xxxx"

    4、编译,链接即可。

    提供三种方法,可供使用。但不论哪种方法,usestr.c 务必与str.h在一起才行。因为二者之间有依赖关系。

    这就是动态库与静态库的差别所在,一般静态库在编译的时候,就把代码加载到程序当中了,而动态库是程序正式运行的时候才去加载文件的。

    1)gcc usestr.c -lstr libstr.a 头文件与依赖库同时列出

    2)gcc usestr.c -lstr -L. 从当前目录中查找依赖库

    gcc usestr.c -lstr -Lmdir 从mdir文件当中查找依赖库,此时 libstr.a 需要放在mdir文件夹中。

    3)export LIBRARY_PATH=mdir

    gcc usestr.c -lstr 设置环境变量,然后程序会自动的从LIBRARY_PATH中查找静态库。

    其中lxxx 表示要链接的libxxx.a 库文件,xxx为库名。-L. 表示在当前目录下找库文件libxxx.a

    具体的过程如下面所示:

    动态库的使用:

    1)产生库

    gcc -c -fpic xxx1.c xxx2.c

    gcc -shared -o libxxx.so xxx1.o xxx2.o

    2) 使用

    编译时: 编写c程序usexxx.c

    方式一:gcc -c usexxx.c ; gcc usexxx.o -lxxx -L.

    方式二:gcc -c usexxx.c; gcc usexxx.o -lxxx

    + 设置环境变量 LIBRARY_PATH.

    运行时:

    方式一:把库文件放到系统标准库目录/usr/lib或者/lib 目录中,就可以运行a.out了。

    方式二:设置环境变量LD_LIBRARY_PATH的值为动态库文件所在的目录,然后运行a.out。

    注意一点:绝对路径没有.点开头,只有相对路径才有。

    关键代码:

    gcc -c welcome.c

    gcc -shared -o libwelcome.so welcome.o

    gcc -c usewel.c

    gcc usewel.o -lwelcome -L.

    cp libwelcome.so /usr/lib 后面的/可有可无

    或者

    LD_LIBRARY_PATH = $LD_LIBRARY_PATH : .

    然后运行 ./a.out 即可。

  • 相关阅读:
    普通平衡树(AVL树)
    正态分布与二项分布
    grahql操作
    skywalking定时删除在大并发下引起的性能问题
    Apache SkyWalking SQL注入漏洞复现分析 (CVE-2020-9483)
    skywalking远程调试Apache SkyWalking SQL注入
    sourceTree详细使用教程
    git 分支的相关操作、创建分支、查看分支、切换分支、删除分支
    [Git高级教程 (一)] 通过Tag标签回退版本修复bug
    idea 版本2018.3.6版本的安装
  • 原文地址:https://www.cnblogs.com/zhuxuekui/p/4420381.html
Copyright © 2011-2022 走看看