Lesson10 Linux 库的创建和使用

一、 库的介绍: 

1.  库的概念:

     事先已经编译好的代码,经过编译后可以直接调⽤的⽂件。

     本质上来说是⼀种可执⾏代码的⼆进制形式,可以被操作系统载⼊内存执⾏。

2.  系统库:/usr/lib、/usr/lib64

3.  库文件名:lib + 库名 + 后缀(.a为静态库;.so为动态库)

二、 静态库与动态库:

1.  静态库:

     静态库的代码在编译时就已经拷⻉到应⽤程序中。

     当有多个程序同时引⽤⼀个静态库函数时,内存中将会生成该函数的多个副本。

     完全拷⻉,⼀旦连接成功,静态库就不再需要了。

     程序代码体积⼤。

2.  动态库:

     在程序内留下⼀个标记,指明当程序执⾏时, ⾸先必须要载⼊这些库。

     在程序开始运⾏后调⽤库函数时才被载⼊,被调⽤函数在内存中只有⼀个副本。

     程序代码体积⼩。

三、 静态库的创建和使用: 

创建步骤:

  • 在头⽂件(.h)中声明静态库所导出的函数
  • 在源⽂件(.c)中实现静态库所导出的函数
  • 编译源⽂件,⽣成⽬标⽂件(.o)
  • 通过命令 ar 将⽬标⽂件加⼊到静态库中
  • 将静态库拷⻉到系统默认的存放库的路径(/usr/local/lib、/usr/local/include),或指定的路径下

使用命令:

  • gcc [源文件] -o [可执行文件名] -I[头文件路径] -L[静态库路径] -l[静态库名]
  • -l :指示编译器,装载的函数库,系统默认的路径(/usr/lib、/usr/lib64)
  • -L:指定库所在的路径
  • -I :指定头文件所在的路径

示例及详解:

1.  头文件与源文件的编写:共 5 个文件。

     

  other1.h

#ifndef OTHER1_H
#define OTHER1_H

#include <stdio.h>

void welcome();

#endif

  other1.c 

#include "other1.h"

void welcome(){
        printf("Welcome to MyProject!\n");
}

  other2.h

#ifndef OTHER2_H
#define OTHER2_H

#include <stdio.h>

int add(int, int);
int sub(int, int);

#endif

  other2.c

#include "other2.h"

int add(int x,int y){
        return x+y;
}

int sub(int x, int y){
        return x-y;
}

   app.c

#include "other1.h"
#include "other2.h"

void main(){
        int a=15, b=3,c;
        printf("test in app\n");
        welcome();
        c=add(a,b);
        printf("%d + %d = %d\n",a,b,c);
        c=sub(a,b);
        printf("%d - %d = %d\n",a,b,c);
}

 示例:此结构下编译 3 个 c 文件,生成可执行程序 app

 

2.  编译源文件:生成目标文件 .o 

gcc -c other1.c -o other1.o
gcc -c other2.c -o other2.o

     

3.  加入到静态库:

ar rcs libother1.a other1.o
ar rcs libother2.a other2.o

 

 示例:此结构下编译 app.c 文件 

gcc app.c -o app -I./ -L./ -lother1 -lother2 

  

 4.  组织项目:

     include 存放头文件、lib 存放库文件、src 存放源代码。

      

    

    示例:此结构下编译 app.c 文件

gcc app.c -o app -Iinclude -Llib -lother1 -lother2

5.  加入系统默认存放库的路径: 

 将头文件和库文件拷贝到 /usr/local 对应目录下

cp include/* /usr/local/include
cp lib/* /usr/local/lib

调用系统库编译文件

gcc app.c -o app -lother1 -lother2

 

四、动态库的创建和使用:

创建步骤:

  • 在头⽂件(.h)中声明动态库所导出的函数
  • 在源⽂件(.c)中实现动态库所导出的函数
  • 编译源⽂件,⽣成与位置⽆关的⽬标⽂件 (.o)
  • 创建动态库
  • 链接动态库

使用命令:

  • 方式一:gcc [源⽂件] -L [动态库路径] -l [动态库名] -I [头⽂件路径] -o [可执⾏⽂件]
  • 方式二:gcc [源⽂件] -I [头⽂件路径] [完整库⽂件名] -o [可执⾏⽂件]

示例及详解:

1.  编写头文件与源文件:与上例静态库中的文件相同。

     

2.  编译源文件并生成与位置无关的目标文件:

gcc -fPIC *.c -I ../include -c

  

3.  创建动态库:

gcc -shared -o liblinux_test.so *.o

  

mv liblinux_test.so ../lib

  

  利用方式二进行链接编译代码:

#注意给定的为绝对路径
gcc app.c -I include $(pwd)/lib/liblinux_test.so -o app

  

4.  链接动态库: 

LD_LIBRARY_PATH:指定除默认路径外查找动态库的路径,该路径在默认路径前进⾏查找。

  • export LD_LIBRARY_PATH=[⾃定义动态库路径],起到临时作⽤
  • 配置环境变量 LD_LIBRARY_PATH,修改文件 ~/.bash_profile 或 ~/.bashrc 或 /etc/profile 或 /etc/bashrc 
  • 直接将动态库拷贝⾄/usr/lib等系统⽬录下(可⾏但强烈不推荐)
  • 将动态库的绝对路径写⼊/etc/ld.so.conf⽂件,使⽤ldconfig命令更新(推荐使用)

利用方式一链接编译代码:

 gcc app.c -Llib -llinux_test -I include -o app

  此时直接运行会报错,输入 ldd app 提示找不到动态库的位置,解决方法如下:

  

  ①设置临时环境变量: export LD_LIBRARY_PATH=$(pwd)/lib

  

  ②配置环境变量: 编辑上述任意文件,添加语句 export LD_LIBRARY_PATH=/myCode/c/linux_about_lib/dynamic/lib 。

  ③加入系统库:本文不做演示。

  ④将绝对路径写⼊ /etc/ld.so.conf :vim /etc/ld.so.conf

      

      完成后进入 /etc/ 文件夹,输入 ldconfig 更新,并可找到目录:

      

      成功运行文件

      

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章