一、静态库的建立
首先将源文件编译成目标文件:gcc –c a.c b.c
生成静态库:ar –rc libstatic.a a.o b.o
然后要写个头文件,包含静态库里的函数原型,
这个头文件要给主程序调用的;
静态库的链接方法:
gcc –o staticcode -I(静态头文件路径) –L(静态库文件路径)
–lstatic main.c (默认库在当前文件夹)
二、共享库
同静态库一样编译成目标文件:gcc –c a.c b.c
生成共享库:gcc –fPIC –shared –o libshared.so a.o b.o
共享库的调用有两种方式:
动态库的分为隐式调用和显式调用两种调用方法:
隐式调用的使用使用方法和静态库的调用差不多,也需要头文件,编译方式也类似,只是
要环境变量LD_LIBRARY_PATH加上该共享库的路径,否则,在运行时会找不到共享库;
(
使用命令echo显示环境变量 ,如:echo $HOME
设置一个新的环境变量,如:export MYNAME=”my name is kevin”
修改已存在的环境变量 ,如:$ MYNAME=”change name to jack”
)
显式调用,要用到头文件,并gcc编译对应的源文件生成可执行文件,-ldl选项;
如:
#include
#include
int main(int argc, char* argv[])
{
//define
function pointor
int (*GetMax)(int a, int b); //声明对应的函数的函数指针
void* pdlhandle;
char*
pszerror;
// open mytestso.so
pdlhandle = dlopen("./mytestso.so", RTLD_LAZY);
pszerror = dlerror();
if (0 != pszerror) {
printf("%s\n", pszerror);
exit(1);
}
// get GetMax func
GetMax = dlsym(pdlhandle, "GetMax");
pszerror = dlerror();
if (0 != pszerror) {
printf("%s\n", pszerror);
exit(1);
}
// close mytestso.so
dlclose(pdlhandle);
}
}
出处:http://blog.sina.com.cn/leetow