前言
linux分文件编程
linux静态库和动态库的创建和使用
一、linux分文件编程
demo1.c 主函数
#include<stdio.h>
#include"demo2.h"
int main()
{
head();
printf("this is main\n");
return 0;
}
demo2.c 功能函数
#include<stdio.h>
void head()
{
printf("this is headfile\n");
}
demo2.h:函数申明
void head();
同时编译两个文件
gcc demo1.c demo2.c
运行结果
二、linux静态库
1.静态库的创建
首先生成.o文件
gcc demo2.c -c
其次将.o文件生成.a静态文件
ar rcs libStatic.a demo2.o
2.静态库的使用
gcc demo1.c -lStatic -L ./
运行结果
三、linux动态库
1.动态库的创建
gcc -shared -fpic demo2.c -o libDynamic.so
2.动态库的使用
gcc demo1.c -lDynamic -L ./
运行结果
动态库的默认搜索路径在
/usr/local/lib
/usr/lib
所以通过环境变量LD_LIBRARY_PATH指定动态库的搜索路径
export LD_LIBRARY_PATH="/home/CLC/shumeipai/test3"
修改完环境变量后执行结果
总结
1.头文件中<>和"“区别:<>只会从系统配置得到库环境中寻找头文件,一般用于标准库头文件;”"优先从当前文件夹中寻找头文件,若找不到则到系统默认的库环境中去找,一般用于自定义的头文件。
2.linux库的概念:库是 一种可执行代码的二进制形式,可以被操作系统载入内存执行。可分为静态库,动态库和共享函数库。
静态函数库,是在程序执行前就加入到目标程序中去了 ;
动态函数库同共享函数库是一个东西(在linux上叫共享对象库, 文件后缀是.so ,windows上叫动态加载函数库, 文件后缀是.dll)。
3.静态库和动态库的优缺点:
静态库
优点:静态库别打包到应用程序中,加载速度快;发布程序无需提供静态库,因为已经在app中,移植方便
缺点:链接是完整地拷贝至可执行文件中,被多次使用就有多份亢余拷贝;更新、部署、发布麻烦
动态库
优点:链接是不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序可以共用,节省内存;程序升级简单,因为app里面没有库的源码,升级之后只要库的名字不变,函数名以及参数不变,只是实现做了优化,就能加载成功
缺点:加载速度比静态库慢;发布程序需要提供依赖的动态库
4.ar:linux中修改,创建静态库。查看参数含义 直接ar 或者–help。r:在库中插入模块,c:创建一个库,s:创建目标文件索引。-L ./:在-L下指定的路径下找库。ar理解为打包生成一个静态库。
-l是制定要用的动态库,库名为除去lib和后缀名剩下的部分,
-shared 指定生成动态库
-fpic 标准,fPIC 选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码。
5.静态库文件.a文件,动态库文件.so文件,以lib开头
6.* 号通配符作用:匹配任意(0个或多个)字符或字符串,包括空字符串。
ls * .c:列出以.c结尾的文件
ls demo*:列出以demo开头的文件
7.mv:移动文件,重命名文件
8.export LD_LIBRARY_PATH 是临时的,换个窗口就没作用,所以通过脚本来执行
start.sh脚本
export LD_LIBRARY_PATH="/home/CLC/shumeipai/test3"
./a.out
给脚本加上可执行的权限
chmod +x start.sh
运行脚本后结果
9.绝对路径包括:/ :表示根目录;~ :表示用户目录;
相对路径包括:. 表示当前目录;. . :表示上一级目录
10.du start.sh:查看start.sh的大小。