Linux库

引入:

分文件编程:
现有如下文件:

FileMain.c//主函数c文件
FileFun.c//分函数c文件
//主函数需调用分函数

创建一个 .h 文件:(内容为分函数的声明)

FileFun.h

然后在主函数C文件中加入头文件:

include "FileFun.h"
//双箭号是默认在 /usr/include/ 下寻找头文件,而双引号则是在当前路径寻找头文件

编译:

gcc FileMain.c FileFun.c

1.什么是库?

库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。就是将源代码转化为二进制格式的源代码,相当于进行了加密,别人可以使用库,但是看不到库中的内容。
一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。
程序函数库可分为3种类型:静态函数库(static libraries)、共享函数库(shared libraries)、动态加载函数库(dynamically loaded libraries)。

2.静态库

静态函数库:是在程序执行前(编译)就加入到目标程序中去了
优点:
(1). 静态库被打包到程序中加载速度快
(2).发布程序无需提供静态库,应为已经在app中,移植方便
缺点:
(1).链接时完整的拷贝至可执行文件中,被多次使用就会有多次冗余拷贝
(2). 更新,部署,发布麻烦

静态库的制作(2个文件:jisuanji.c(定义加减乘除), jisuan.c(main)):

静态库文件的格式:xxxx.a
a. 生成xxx.o文件:

gcc jisuanji.c -c

b.xxx.o文件生成xxx.a静态库文件

ar rcs libjisuanji.a jisuanji.o
//     静态库名       

静态库的使用:

gcc jisuan.c -ljisuanji -L./ -o xxx(名字)
jisuan.c  主函数所在的文件
-ljisuanji   -l:是指定要用的动态库,库名(libjisuanji.c)砍头去尾
-L./     -L 是指定 gcc 编译器寻找静态库的路径(-L./ 指定为当前路径),否则默认在 /usr/lib 或 usr/local/lib 路径下寻找

!!此处也需要 .h(函数声明)文件,并在主函数所在文件包含相应头文件 !!

3.动态库

动态函数库:是在程序执行时动态(临时)有目标程序去调用。
动态函数库和共享函数库是一个东西(在 linux 上叫共享对象库, 文件后缀是 .so ,windows 上叫动态加载函数库,文件后缀是 .dll )
Linux中命名系统中共享库的规则:
在这里插入图片描述
优点:
(1).链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序可以共用,节省内存。
(2).程序升级简单
缺点:
(1).加载速度比静态库慢
(2).发布程序需要提供依赖的动态库

动态库的制作(2个文件:jisuanji.c(定义加减乘除), jisuan.c(main)):

动态库文件的格式:xxx.so
把 .c 文件生成 .so 动态库文件

gcc -shared -fpic jisuanji.c -o libjisuanji.so
-shared  指定生成动态库
-fpic fpic标准,fpic选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码
jisuanji.c    需生成为动态库的 .c 源文件
libjisuanji.so   生成的动态库的文件名

动态库的使用:

gcc jisuan.c -ljisuanji -L./ -o xxx(名字)
jisuan.c  主函数所在的文件
-ljisuanji   -l:是指定要用的动态库,库名(libjisuanji.c)砍头去尾
-L./     -L 是指定 gcc 编译器寻找静态库的路径(-L./ 指定为当前路径),否则默认在 /usr/lib 或 usr/local/lib 路径下寻找

此时xxx(生成的可执行文件)不能直接运行:

直接运行时:

./libtest	// 直接运行
./libtest: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory	// 系统提示	

方案一:
需要将动态库文件放到 /usr/lib 路径下(此操作需要获取权限):

sudo  cp  libtest.so  /usr/lib   

方案2:指定动态库的搜索路径:
(1).指定路径:
export LD_LIBRARY_PATH="/指定路径(pwd)" // 通过环境变量 LD_LIBRARY_PATH 指定动态库搜索路径,只有临时作用(仅对一个终端有效)
(2)通过shell脚本:

创建一个 shell 脚本文件 xxx.sh(内容如下):
export LD_LIBRARY_PATH="/指定路径(pwd)"
./xxx(生成的可执行文件名称)
// 为脚本文件增加可执行权限:
chmod  +x  xxx.sh(名称)

// 执行脚本文件:
./xxx.sh

4.-L,-I,-l 的区别:

-L:后面的路径存放着库文件的地址,第一个寻找库文件的目录
-l(小写 L):-l 后面跟着的是动态库的名字,会寻找动态库文件
-I (大写i):-I后面的路径存放着头文件的地址,第一个寻找头文件的目录

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值