一 头文件与库文件(模块化,可重用,好维护)
在使用C语言和其他语言进行程序设计的时候,我们需要头文件来提供对常数的定义和对系统以及库函数调用的声明
库文件是一些预先编译好的函数的集合,那些函数都是按照可重用原则编写的。它们通常由一组互相关联的用来完成某项常见工作的函数构成
比如用来处理屏幕现实的函数和数据库访问例程等。

二 使用外部库
gcc -Wall calc.c -o calc -lm
-lm表示要链接libm.so或者libm.a

三  静态库与共享库
静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中,程序运行的时候将不再需要静态库
动态库(.so或.sa):程序运行的时候才去链接共享库代码,多个程序共享使用库的代码

生产静态库
ar rcs libhello.a  hello_fn.o  :多个.o文件生成.a静态库 
ar是GNU归档工具,rcs表示replace and create
使用这个库
gcc -Wall -L. main.c -o main -lhello   (lib可省略.-L.表示库文件位置在当前目录下,否则在系统目录下搜索)

库搜索路径:
C_INCLUDE_PATH 、LIBRARY_PATH
从左到右搜索-I(指定头文件搜索路径) -L(指定库的搜索路径)指定的目录
由环境变量指定的目录
由系统指定的目录

四 生成共享库
shared:表示生成共享库
fPIC:产生位置无关码(指的是运行加载与内存地址无关)
库名规则:libxxx.so
gcc -shared -fPIC hello.o -o libhello.so

使用共享库
I:连接共享库,只要库名即可
L:链接库所在的路径
gcc -Wall -L. main.c -o main  -lhello

运行共享库
1、拷贝.so文件到系统共享库路径下 /usr/lib
2、更改LD_LIBRARY_PATH
3、Idconfig配置Id.so.conf,Idconfig更新Id.so.cache

五、GCC选项_-Wl,-soname

-Wl选项告诉编译器将后面的参数传递给链接器。

-soname则指定了动态库的soname(简单共享名,Short for shared object name)

soname的关键功能是它提供了兼容性的标准:

当要升级系统中的一个库时,并且新库的soname和老库的soname一样,用旧库链接生成的程序使用新库依然能正常运行。这个特性使得在Linux下,升级使得共享库的程序和定位错误变得十分容易。

在Linux中,应用程序通过使用soname,来指定所希望库的版本,库作者可以通过保留或改变soname来声明,哪些版本是兼容的,这使得程序员摆脱了共享库版本冲突问题的困扰。

可以通过readelf -d来查看每个动态库的SONAME

1. 声明libto.so.1,并生成libto.so.1.2

[root@localhost c]# gcc -fPIC -shared -Wl,-soname,libto.so.1 -o libto.so.1.2 to.c  
[root@localhost c]# ls -lh  
-rwxr-xr-x 1 root root 4268 Jan 10 17:22 libto.so.1.2  
[root@localhost c]# ldconfig -n ./  
lrwxrwxrwx 1 root root  12 Jan 10 17:23 libto.so.1 -> libto.so.1.2  
-rwxr-xr-x 1 root root 4.2K Jan 10 17:22 libto.so.1.2  
[root@localhost c]# readelf -d libto.so.1.2

最新文章

  1. 安装wamp2.5报权限错误的解决办法
  2. 在AppDelegate 或其它地方用UITabBarController怎么办
  3. HTTP Servlet 重要的几个方法
  4. gulp顺序执行任务
  5. 标准I/O库之格式化I/O
  6. HTML5 Web Storage使用实例
  7. A Game of Thrones(16) - Edard
  8. 【Swift初见】Swift词典
  9. C++侵入式链表
  10. Android研究之监听自身应用被卸载代码实现
  11. C#概念总结(一)
  12. Codeforces 264C Choosing Balls 动态规划
  13. MyEclipse、Eclipse使用配置及部分问题
  14. canvas-star6-drawMoon.html
  15. docker swarm英文文档学习-8-在集群中部署服务
  16. jquery ajax超时设置(转载)
  17. Qt中中文字符 一劳永逸的解决方法
  18. 树莓派踩坑备忘录 -- 使用 Linux
  19. Java和C#基本类库的区别
  20. TensorFlow 中的 tf.train.exponential_decay() 指数衰减法

热门文章

  1. sop服务治理
  2. 关于 Promise 的一些简单理解
  3. k8s集群添加新得node节点
  4. python虚拟环境的配置-ubuntu 18.04后
  5. Python自动化准备工作(pycharm安装)
  6. Kibana详细入门教程
  7. centos8平台用NetworkManager/nmcli管理网络
  8. samesite-cookie详解(译文)
  9. 洛谷 P6602 数轴
  10. spring-boot-route(二十一)quartz实现动态定时任务