Linux库文件的生成和使用

1.库文件
1.1库文件介绍

库是一组预先编译好的方法的集合。Linux系统存储的库的位置一般在:/lib 和 /usr/lib。 在 64 位的系统上有些库也可能被存储在/usr/lib64 下。库的头文件一般会被存储在 /usr/include 下或其子目录下。 库有两种,一种是静态库,其命令规则为 libxxx.a,一种是共享库,其命令规则为 libxxx.so

示例:c的printf()函数声明存在于<stdio>头文件中,实现存在库中,库的作用就是存放编译好的方法集合

1.2库文件的分类

库文件可以分为静态库,共享库(windows里面称作为动态链接库)

静态库后缀名 :libxx.x

共享库(动态链接库):libxx.so

(xx泛指库文件的统一类型名简称)

1.3静态库的生成和使用

ar crv (需要生成的静态库名称) (里面需要包含的文件)

里面需要包含的文件类型,通常是源代码经过编译产生的二进制代码

生成静态库示例

使用静态库示例

-L 代表需要访问的静态库地址

-l 代表需要访问的静态库名称

1.4共享库的生成方法

gcc -shared -fPIC (需要生成的静态库名称) (里面需要包含的文件)

生成共享库示例

使用共享库示例

编译完毕后无法运行main,提示找不到共享库

需要将生成的共享库移动到 /usr/lib中

共享库生成后,编译完毕,生成可执行程序 可执行程序不可以正常运行,涉及到下面需要提到的静态库和共享库的区别。

1.5静态库共享库区别

1.程序编译区别

静态库在程序编译的时候,会将静态库里面包含的方法实现拷贝一份在可执行程序中,继而使用静态库编译的程序在程序编译完毕后删除静态库后仍然可以正常运行

共享库在程序编译的时候,可执行程序会标记共享库,在程序需要运行的时候去搜索共享库(linux 中默认搜索路径是 /usr/lib)中

2.装载时机区别

共享库装载时机

在lib库中 如果存在 libfoo.a libfoo.so 两种库,包含的内容相同,但是库的类型不同时,会优先使用共享库,使用共享库的逻辑时在执行一个可执行程序的时候,如果需要使用libfoo.so 共享库,内存会将该共享库加载到内存中,直到程序结束才会释放加载该共享库所消耗的内存。如果多个可执行程序都需要依赖该共享库,则是等所有依赖该共享库的可执行程序执行完毕才会释放加载共享库的内存

静态库装载时机

静态库随着程序编译一起被装载在可执行程序当中

共享库比较于静态库生成的可执行程序在代码量非常大的时候作用更加明显

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Linux文件可以分为静态和动态两种形式。静态文件名通常以“.a”结尾,而动态文件名通常以“.so”结尾。 ### 静态 静态是一组函数和数据的集合,它们被打包成一个单独的文件,与程序一起链接并在程序运行时加载到内存。静态在程序编译时就被链接到可执行文件,因此它们不需要在运行时再次加载到内存。 #### 创建静态 1. 编写源代码文件,例如 `mylib.c` 。 2. 编译源代码文件生成目标文件 `mylib.o` : ``` gcc -c mylib.c -o mylib.o ``` 3. 将目标文件打包成静态文件 `libmylib.a` : ``` ar rcs libmylib.a mylib.o ``` 其,`ar` 是一个用于创建、修改和提取归档文件的工具,`rcs` 分别表示创建、替换和添加目标文件到归档文件。 #### 使用静态编译程序时,需要指定要使用的静态文件。例如,编写一个使用 `mylib` 静态的程序: 1. 编写源代码文件 `main.c` ,包含 `mylib.h` 头文件: ```c #include <stdio.h> #include "mylib.h" int main() { int result = add(1, 2); printf("The result is %d\n", result); return 0; } ``` 2. 编译源代码文件,链接 `libmylib.a` 静态: ``` gcc main.c -L. -lmylib -o main ``` 其,`-L.` 指定要搜索的文件路径为当前目录,`-lmylib` 指定要链接的静态文件名为 `libmylib.a` 。 ### 动态 动态也是一组函数和数据的集合,但它们与程序不是在编译时就被链接,而是在程序运行时动态加载到内存。因此,动态的优点是可以节省内存空间,多个程序可以共享同一个动态。 #### 创建动态 1. 编写源代码文件,例如 `mylib.c` 。 2. 编译源代码文件为共享目标文件 `libmylib.so` : ``` gcc -shared -fPIC mylib.c -o libmylib.so ``` 其,`-shared` 表示生成共享目标文件,`-fPIC` 表示在编译生成位置独立的代码。 #### 使用动态编译程序时,需要指定要使用的动态文件。例如,编写一个使用 `mylib` 动态的程序: 1. 编写源代码文件 `main.c` ,包含 `mylib.h` 头文件: ```c #include <stdio.h> #include "mylib.h" #include <dlfcn.h> int main() { void *handle = dlopen("./libmylib.so", RTLD_LAZY); if (!handle) { printf("Failed to load library.\n"); return 1; } int (*add)(int, int) = dlsym(handle, "add"); if (!add) { printf("Failed to find symbol.\n"); return 1; } int result = add(1, 2); printf("The result is %d\n", result); dlclose(handle); return 0; } ``` 2. 编译源代码文件,链接 `libdl.so` 动态: ``` gcc main.c -ldl -o main ``` 其,`-ldl` 指定要链接的动态文件名为 `libdl.so` ,它是用于动态加载文件的标准Linux动态
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值