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