原创 静态函数库和动态函数库的设计

2015-3-3 23:10 1129 19 20 分类: MCU/ 嵌入式 文集: Linux应用程序开发学习

程序设计中,离不开函数的使用。那么,Linux应用程序设计中需要的外部函数谁来提供呢?

Linux应用程序设计中需要的外部函数主要由函数库和系统调用来提供。


那么,函数库和系统调用的函数有什么区别呢?
函数库属于开发者或者生产厂商根据自己的需要编写的函数库。而系统调用函数主要是内核代码,主要用于内核。
 
 
函数库按照链接方式可分为:
  •  静态链接库
  •  动态链接库
Linux应用程序使用的主要函数库存放于/lib,和/user/lib目录下。其中动态链接库采用*.so形式命名,静态链接库使用*.a命名。
静态链接库的特点:程序所要用到的库函数代码在链接时全部被copy到程序中。从而导致的问题是,若多个进程在内存中同时运行,并且使用了相同的库函数将会产生多份拷贝,从而造成了对空间的浪费。
 
rsila2njcb99sha3vjqg9cjm31_70f71b44d4cfc0de8ee0303ff880831e1425394641.0947.jpg
使用静态库编译的方法:因为,Linux下进行链接时默认的采用动态链接库。故直接用gcc -static XXX.c -o XXX.o静态库编译命令将会产生找不到静态库的错误。故我们需要首先安装静态库文件然后再进行静态编译。
 
如何编写自己的静态库?
  1. 编写自己的库函数C文件。假设命名为mylib.c
  2. 使用gcc -c mylib.c -o mylib.o命令生成可执行文件
  3. 使用ar cqs libmylib.a mylib.o  将可执行文件打包为*.a文件
  4. 将制作好的libmylib.a 文件复制到/usr/lib文件夹下
编译命令: gcc -static test.c -lmylib -o test.o 
 
 
  
如何编写自己的动态库?
  1. 编写自己的库函数C文件。假设命名为mylib.c
  2. 使用gcc -c mylib.c -o mylib.o命令生成可执行文件
  3. 使用gcc -shared -fpic mylib.o -o libmylib.so  将可执行文件打包为*.so文件
  4. 将制作好的libmylib.so 文件复制到/usr/lib文件夹下
编译命令: gcc  test.c -lmylib -o test.o 
注:
  1. 使用自己制作的静态库文件时要编写相对应的头文件.
  2. -lname :gcc 在链接时,默认只会链接C函数库,而对于其他的函数库需要使用 -l 选项来显示地指明需要链接。如本例中的 -lmylib   虽然,mylib库在/usr/lib 文件夹下名字为libmylib.a 。但是编译命令为-lmylib即可。
  3. -fpic 使输出的对象模块是按照重定位地址方式生成的
  4. -shared 指明生成动态链接库
附录:
  1. 库文件mylib.c

#include
int compare_num(int a, int b)
{
     if(a>b)
          printf("a>b\n");
     else
          printf("a<=b\n");
     return 0;
}
 
     2. 头文件 mylib.h
int compare_num(int a, int b);
 
     3. 测试文件 test.c
#include
#include"mylib.h"
int main()
{
     compare_num(1, 5);
     return 0;
}
PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

roumao_411466022 2015-3-14 17:35

顶你!
相关推荐阅读
潇洒哥 2015-07-08 16:01
位操作符的使用技巧
在C语言编程中,数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作。一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效...
潇洒哥 2015-04-04 17:39
finish shell分析之底层usart
rt_thread的finsh shell系统不愧是调试的一项利器,它可以除了完成一般shell的功能外,甚至还可以自定义命令。这个对功能单一的嵌入式系统来说是十分可贵的。在此我并不想对finsh...
潇洒哥 2015-04-01 21:29
__main() 和 main()
因为我们通常在BOOTLOADER中都已做好了比较细致的初始化工作,包括代码的搬运,所以我们最好别再调用库函数__main(),因为__main()作为ADS集成好的库函数,会对系统进行初始化设置...
潇洒哥 2015-03-26 22:54
RT-Thread学习之scons篇--解析rtconfig.py文件
rtconfig.py文件,主要用于指定编译器以及安装路径。除此之外,该文件中定义了大量的变量,这些变量包括编译选项,汇编选项,链接选项。   import os # toolchain...
潇洒哥 2015-03-26 22:53
RT-Thread学习之scons篇--SConsruct脚本文件解析
       scons的构建文件名称是统一的都称为SConstruct。其是scons所接受的编译脚本主文件。当然为了方便目录的组织,也允许在各个目录下面存放SConscript, 然后最上面S...
潇洒哥 2015-03-26 22:53
RT-Thread学习之scons篇--SConcript文件解析
SConscript文件是用来指定哪些文件会加入编译。先来分析下BSP主目录下的SConscript文件: import rtconfig Import('RTT_ROOT') fro...
我要评论
1
19
关闭 站长推荐上一条 /3 下一条