Linux静态和动态链接库使用实例
Ø 不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。也就是说不用头文件即可被导出。
Ø 静态和动态的区别
静态库的代码在编译时已经进入被包含到目标文件了;而动态库的代码要在目标文件运行的时候才会被包含进去,在编译的时候只是对动态库进行一个链接。
1、静态链接库实例
//fun1.h #include <stdio.h> void fun1printf();
//fun1.c #include "fun1.h" void fun1printf() { printf("fun1printf!/n"); }
//fun2.h #include <stdio.h> void fun2printf();
//fun2.c #include "fun2.h" void fun2printf() { printf("fun2printf!/n"); } / //staticcall.c #include <stdio.h> int main() { fun1printf();//不需要导入,直接引用函数 } /// //makefile all:staticlib main staticlib:fun1.c fun2.c gcc -c -o fun1.o fun1.c gcc -c -o fun2.o fun2.c ar cqs libfun.a fun1.o fun2.o main:staticcall.c libfun.a gcc -o staticcall staticcall.c -L ./ -lfun |
生成静态链接库的命令是ar cqs。
2、动态链接库实例
所有文件同静态链接库,只是makefile编写不一样。
all:sharedlib sharedcall sharedlib:fun1.c fun2.c gcc -fPIC -c fun1.c -o fun1.o gcc -fPIC -c fun2.c -o fun2.o gcc -shared fun1.o fun2.o -o libfun.so sharedcall: gcc -o sharedcall -L ./ -lfun sharedcall.c |
编译生成动态链接库的文件时,必须加上-fPIC,Position Independent Code(地址无关编码)。
在运行程序之前,必须:
Ø export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/ccode/dll/
Ø 在/etc/ld.so.conf中添加/root/ccode/dll/路径