|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
由于在linux中,用户权限很大,做任何事情都很自由,所以,你往往需要知道你做的每一步在干什么。
1、静态库的创立和利用:
1、天生静态库:库名libmylib.a
arrcslibmylib.amylib.o
2、将静态库copy到/usr/lib/或/lib/目次下
cplibmylib.a/usr/lib/
3、静态库的利用
好比测试文件为test.c
gcc-0testtest.c-lmylib
-l为选项,mylib为库名。mylib为libmylib的两头部分,Linux下商定一切库都之前缀lib入手下手
静态库以.a开头,静态库以.so开头。再编译程式时,无需带上前缀和后缀。
注重:静态库的定名必要以"lib"开首,否者毗连是编译器没法找到库
2、静态库的创立和利用:
1、上面命令把mylib.c程序创立成了一个静态库
(1)、gcc-fPIC-omylib.o-cmylib.c
(2)、gcc-shared-olibttt.somylib.o
也能够间接利用一条命令
gcc-fPIC-shared-olibttt.somylib.c
2、Linux有两种体例挪用静态库毗连中的函数
(1)、gcc-otesttest.c./libttt.so
(2)、cplibttt.so/usr/lib/libttt.so
gcc-otesttest.c/usr/lib/libttt.so
注重:援用静态库时,必需含有路径,假如只是利用libttt.so,则必需确保这个库地点目次包含再PATH情况变量中
3、体系函数利用静态库:
1、void*dlopen(constchar*filename,intflag)
用于翻开指命名字的静态链接库,并前往一个句柄
flag:RTLD_LAZY,RTLD_NEW,RTLD_GLOBAL
RTLD_LAZY:在dlopen()前往前,关于静态库中存在的不决义的变量(如内部变extern,也能够是函数)
不实行剖析,也就是不剖析这个变量的地点
RTLD_NEW:与RTLD_LAZY分歧,在dlopen()前往前,剖析处每一个不决义的变量的地点,假如剖析不出来,dlopen会前往NULL,错位为"undefinedsymbol:xxx..."
RTLD_GLOBAL:是库中被剖析出来的变量在随后的别的链接库中也能够利用,即全局无效。
2、void*dlsym(void*handle,char*symbol)
依据静态链接库的句柄与函数名,前往函数名对应的函数的地点。
3、intdlclose(void*handle)
封闭静态链接库,handle是挪用dlopen函数库的句柄
4、constchar*dlerror(void)
静态库链接库实行失利时,dlerror前往毛病信息,若实行乐成,则前往NULL
例子:
main.c
intmain(void)
{
void*handle;
char*error;
void(*welcome)();
if((handle=dlopen("./libttt.so",RTLD_LAZY))==NULL)
{
printf("dlopenerror
");
return-1;
}
welcome=dlsym(handle,"welcome");
if((error=dlerror())!=NULL)
{
printf("dlsymerror
");
return-1;
}
welcome();
dlclose(handle);
return0;
}
gcc-ldl-omainmain.c
-ldl指明dlopen函数地点的库。
注重:dlopen("./libttt.so",RTLD_LAZY),的目次是在以后目次下,假如不在以后目次下,程序运转毛病
共享库举行更新或安装新库后,必需运转ldconfig命令更新/etc/ld.conf文件中响应的项
假如利用RPM举行安装,一样平常会主动举行更新,不外也不克不及包管这一点。
利用数学库时加上-lm
gcc-lm
库工具利用:
ldd工具
ldd用来显现实行文件必要哪些共享库,共享库装载办理器在那里找到了必要的共享库
</p>
如果你只是想应付一下操作系统的课程,劝你最好别学,或者说不要指望能用的怎么样。 |
|