营销GNU_GCC_开发教程.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
GNU_GCC_开发教程

隐式调用动态方法 必须要能让程序运行能找动态链接库,Linux有如下几种方法. 把库所在路径加入/etc/ld.so.conf,程序加载是会首先到这里路径查找 设置环境变量LD_LIBRARY_PATH,把库所在路径加入这个变量中,这是最常用的方法 演示代码将采用这一方法运行,写一个脚本run_so.sh 将export LD_LIBRARY_PATH和执行语句写在一行命令中,并用;隔开 export LD_LIBRARY_PATH=$PWD;./mani_so #!/bin/sh export LD_LIBRARY_PATH=$PWD:$LD_LIBRARY_PATH ./main_so ldd ./main_so #用ldd查看用了哪些动态库 * 隐式动态库的执行结果 * 动态库的显示调用 显示调用, Linux 提供 4 个库函数( dlopen , dlerror , dlsym 和 dlclose ),一个 include 文件( dlfcn.h )以支持动态链接装入器 dlopen 将共享目标文件打开并且映射到内存中,并且返回句柄 dlsym返回一个指向被请求入口点的指针 dlerror 返回 NULL 或者一个指向描述最近错误的 ASCII 字符串的指针 dlclose关闭句柄并且取消共享目标文件的映射 这四个函数被包含在libdl.a/libdl.so之中,所以使用动态显示调用,必须要链接-ldl 这一机制是后来加入,模仿Windows下的LoadLibrary/FreeLibrary机制 不同调用方式对动态库本身没有任何影响,需要调整是调用库函数的应用程序,要做较大调整. * dlopen()的说明 void *dlopen(const char *filename, int flag); 将共享目标文件打开并且映射到内存中,并且返回句柄 声明在头文件dlfcn.h之中 第一个参数:指定共享库的名称,将会在下面位置查找指定的共享库。 dlopen call 中的绝对文件路径 在 LD_LIBRARY_PATH 环境变量中指定的目录中 在 /etc/ld.so.cache 中指定的库列表之中 先在 /usr/lib 之中,然后在 /lib 之中 第二个参数:指定如何打开共享库。 RTLD_NOW:将共享库中的所有函数加载到内存 RTLD_LAZY:会推后共享库中的函数的加载操作,直到调用dlsym()时方加载某函数 * 其它dl函数声明 const char *dlerror(void); 如果上一步的dl函数出错,则返回非空字符串,指明错误原因 void *dlsym(void *handle, char *symbol); 用库函数名字symbol在dlopen打开的handle查找一个函数指针,如果找到,则放入返回值中,应用程序可以直接用函数指针来操作. int dlclose(void *handle); 关闭dlopen打开的句柄 * 关于使用显示动态库的步骤 必须包含头文件 #includedlfcn.h 声明使用的到库函数的函数指针 用dlopen打开共享库 用dlsym取得对应库函数的函数指针 如果成功,使用直接调用这个指针.相当于使用库函数 用完共享库后,用dlclose释放共享库 * 使用显示调用实例(1) #includestdio.h #includedlfcn.h/* 加入头文件支持*/ int main(int argc, char* argv[]) { //define function pointor int (*pStrlenFun)(char* pStr); //声明对应的函数的函数指针 int (*pStrnlenFun)(char* pStr, int ulMaxLen); char str[] = {hello world}; unsigned long ulLength = 0; void *pdlHandle; char *pszErr; pdlHandle = dlopen(“./libstrdl.so”, RTLD_LAZY); //加载动态链接库/libstrdl.so if(!pdlHandle) { printf(Failed load library\n); } * 使用显示调用实例(2) /* 接上一段代码 */ /* 判断dlopen是否打开出错,如是,打印错误后退出*/ pszErr = dlerror(); if(pszErr != NULL) {

文档评论(0)

ranfand + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档