2020-11-25

Linux库概念及相关编程(面试重点)

一、分文件编程案列
好处:

分模块的编程思想
网络
超声波
电机
功能责任划分
方便调试
主程序简洁
二、库文件

库是一组预先编译好的函数的集合,这些函数都是按照可重用的原则编写的。在库中的函数是相互关联的,通过这些函数的组成可以实现相应的功能,如屏幕处理函数库(curses和ncurses库)、数据库访问例程(dbm库)。
在Linux中,标准的库文件一般存放在/lib和usr/lib的目录中。c语言编译器gcc(更确切的说是链接程序)需要知道要搜索哪些库文件,因为默认情况下,它只搜索标准C语言库。仅仅把库文件放在标准目录中就希望C语言编译器gcc能够找到它是不够的,库文件必须遵循特定的命名规范并且需要在命令行中明确指定。
gcc -o hello hello.c /usr/lib/libm.a
1.库文件的名字总是以lib开头,随后分别指明这是什么库(如c代表C语言库,m代表数学库);
2. .a 代表传统的静态函数库
3. .so 代表共享函数库
4. 函数库通常以静态库和共享库两种格式存在,可以通过完整的库文件路径名或用-l标志来告诉C语言编译器gcc要搜索的库文件,如gcc -o hello hello.c /usr/lib/libm.a命令要求在编译hello.c源文件编译成hello的可执行文件的过程中,编译器除了会搜索标准的C语言函数库以外,还会搜索数学库以解决函数引用的问题。gcc -o hello hello.c -lm命令是命令gcc -o hello hello.c /usr/lib/libm.a的简写方式,-lm标志代表的是标准库目录中名为libm.a的函数库,同时使用-lm标志另一个好处是如果有共享库,编译器会自动选择共享库。
5. 虽然库文件和头文件一样,通常都保存在标准位置,但是我们可以通过使用-L标志为gcc编译器增加库的搜索路径。如gcc -o hello -L/usr/hello/lib hello.c -lm这条命令是用/usr/hello/lib目录中的libm库来编译和链接可执行程序hello。

三、静态库

静态库函数,是在程序执行前(编译)就加到目标程序中去了。
优点:运行快(静态库被打包到应用程序中加载速度快)
发布程序无需提供静态库,因为已经在app中移植方便。
缺点:内存大(链接时完整拷贝到可执行文件中,被多次使用便有重复)

四、动态库

动态库函数。是在程序执行是动态(临时)由目标程序去调用
优点:小(链接时不复制,程序运行时由系统动态加载到内存中,供程序调用系统只加载一次,多个程序可以共用,节省内存、程序升级简单,因为app里面没有库的源代码,升级之后只要库的名字不变,函数名以及参数不变只是实现做了优化,就能加载成功)
缺点:运行慢(加载速度比静态库慢,发布程序需要提供依赖的动态库)

五、库的制作

1.静态库的制作
格式xxxx.a

gcc calcufuncs.c  -c   生成xxx.o文件
ar  rcs  libcalucfuncs.a calcufuncs.o  xxx.o文件生成xxx.a静态库文件

2.动态库的制作

gcc -shared -fpic calcufuncs.o  -o libcalc.so
-shared 指定生成动态库
-fpic 标准,fpic选项作用与编译阶段,在生成目标文件时就得使用该选项,一生成位置无关的代码

3.库的使用

静态库
gcc  calculatorT.c -lcalcufunc -L ./ -o mainProStatic

-lcalcufunc -l是制定要用的动态库,库名砍头去尾
-L告诉gcc编译器从-L制定的路径去找静态库,默认是从/usr/lib   /usr/local/lib 去找

gcc calculatorT.c -lcalc -L./ -o mainProDy libcalc.so

http://blog.csdn.net/weicao1990/article/details/51028335[引用动态库,怎么指定动态库的位置

](http://blog.csdn.net/weicao1990/article/details/51028335)

你可能感兴趣的:(linux库/静态/动态,linux)