赞
踩
库是已经写好的,只需要调用,就可以使用的。我们平常写的代码、调用的函数名,都是在调用库。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。
1、静态库(linux下的库形式 : xxxx.a 、 windows下的库形式 : xxxx.lib)
静态函数库,是函数执行前(编译)就加到目标程序中去了。
优点:
(1)运行快。
(2)发布程序无需提供静态库,因为已经在APP中,移植方便。
缺点:
(1) 程序大。
(2)链接时完整地拷贝至可执行文件中,别多次使用就有多份冗余拷贝。
(3)更新,部署,发布较为麻烦
2、动态库(linux下的库形式 : xxxx.so 、 windows下的库形式 : xxxx.dll)
编译一个C语言程序是一个多阶段的过程。从总体上看,这个过程可以分成四个独立的阶段。
预处理——编译——汇编——链接
将.c中的头文件,宏定义展开及替换,生成.i文件
命令:gcc -E xx.c -o xx.i(预处理器cpp对#做替换:头文件、宏,去掉注释,条件编译)
将预处理之后的.i文件生成汇编代码.s文件
命令:gcc -S xx.i -o xx.s(编译器ccl 对程序 进行语法及词法分析)
把.s汇编文件生成.o目标文件
命令:gcc -c xx.s -o xx.o(汇编器as将汇编代码 转换 机器码 )
把.o目标文件与库链接,生成可执行文件
命令:gcc xx.o -o xx(链接器ld将.o文件链接到一起生成可执行程序)
注意:xx.c 、 xx.i 、xx.s 都是文本文件
xx.o 二进制文件
链接的时候需要链接到库,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。
首先,在我们工作中,我们写的代码,或者程序,都是为了客户服务。当客户使用我们的代码的时候,我们为了保密,我不想提供我的源代码给客户,因此出现了静态库,和动态库的使用。客户只需调用相对应的库,就可以实现功能。即不用给对方源代码,也不用被对方发现自己的代码写的不完美。
静态库文件名的命名方式是“libxxx.a”, lib 表示库,xxx 表示此静态库的名字,.a 表示静态库的后缀
首先:准备原材料(即功能.c文件) 比如:arithmetic.c
注意:不是main程序。
第一步:把原材料生成 xxx.o 文件
命令; gcc arithmetic .c -c
第二步:使用ar命令生成静态库文件
命令: ar -rcs libarithmetic.a arithmetic.o
解析:把 arithmetic.o 文件生成 libarithmetic.a 静态库文件
制作完成
静态库文件砍头去尾,头+ “ -l ”
如: ( libgongneng.a)红色字体,头跟尾———— -larithmetic
命令:gcc 主函数.c -larithmetic -o 执行文件
找不到库文件,别慌,-l表示先从 usr/lib/ 此路径找,但是,我们的库文件在当前位置,因此,会找不到,找不到的结果就是报错误。因此,需要再加个优先在哪找的指令 -L ./(在当前位置)
命令:gcc 主函数.c -larithmetic -L ./ -o 执行文件
运行:./执行文件
在我们工作中静态库使用的很少。
一方面,比如某个产品使用了我提供的静态库文件,当此产品需要更新的时候,我还得再提供给它静态库文件。
另一方面,某个程序,某些功能都需要调用我提供的静态库 ,会出现冗余拷贝。什么意思,就是此产品程序中,有多份我提供的静态库文件,占内存。
而我们常常使用的是动态库。
动态库的命名方式与静态库类似,前缀相同,为“lib”,后缀变为“.so”。xxx 为动态库名
注意:是把功能.c程序生成库,并不是main程序
命令: gcc -shared -fpic 功能.c -o libxxx.so 生成libxxx.so动态库
-shared:指定生成动态库
-fpic 标准,fPIC 选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码。
和静态库一样的编译方式生成可执行文件时
命令:gcc 主函数.c -larithmetic -L ./ -o 执行文件
会报错,解决方法:
方法1:把库放在默认路径里,即/usr/lib/(不用,只需了解)
命令:sudo cp libxxx.so /usr/lib/ 将库拷贝到 /usr/lib/
再运行 ——成功
这种方法不使用,有可能会误改到其它库。
方法2:指定动态库的位置(有用,但不够完善)
1.输入pwd获取目前路径
2使用命令: export LD_LIBRARY_PATH="xxx" //xxx为pwd获取的路径
把此目前路径,通俗地讲,就是把此路径变成 为存放库的路径。类似 /usr/lib/
但是,有个弊端,当我们再开个窗口时,编译程序的时候,会失败
因此,方法二,还得再改进,改进为方法三
方法三:也是最常用的方法
基于方法二的基础上编写写shell脚本(如 shell.sh)
脚本内容:
一开始创建的脚本是无执行权限的,因此,需要赋执行权限。
使用命令: chmod +x shell.sh
你学会了??
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。