动态库

4.3. dlsym()

 

  如果你加载了一个DL函数库而不去使用当然是不可能的了,使用一个DL函数库的最主要的一个函数就是dlsym(),这个函数在一个已经打开的函数库里面查找给定的符号。这个函数如下定义:

 

  void * dlsym(void *handle, char *symbol);

 

  函数中的参数handle就是由dlopen打开后返回的句柄,symbol是一个以NULL结尾的字符串。

 

  如果dlsym()函数没有找到需要查找的symbol,则返回NULL。如果你知道某个symbol的值不可能是NULL或者0,那么就很好,你就可以根据这个返回结果判断查找的symbol是否存在了;不过,如果某个symbol的值就是NULL,那么这个判断就有问题了。标准的判断方法是先调用dlerror(),清除以前可能存在的错误,然后调用dlsym()来访问一个symbol,然后再调用dlerror()来判断是否出现了错误。一个典型的过程如下:

 

   dlerror(); /* clear error code */

   s = (actual_type) dlsym(handle, symbol_being_searched_for);

   if ((err = dlerror()) != NULL)

   {

   /* handle error, the symbol wasn't found */

  }

  else

  {

   /* symbol found, its value is in s */

  }

 

4.4. dlclose()

 

 dlopen()函数的反过程就是dlclose()函数,dlclose()函数用力关闭一个DL函数库。Dl函数库维持一个资源利用的计数器,当调用dlclose的时候,就把这个计数器的计数减一,如果计数器为0,则真正的释放掉。真正释放的时候,如果函数库里面有_fini()这个函数,则自动调用_fini()这个函数,做一些必要的处理。Dlclose()返回0表示成功,其他非0值表示错误。

  

4.5. DL Library Example

 

  下面是一个例子。例子中调入math函数库,然后打印2.0的余弦函数值。例子中每次都检查是否出错。应该是个不错的范例:

 

   #include

   #include

   #include

   int main(int argc, char **argv)

   {

   void *handle;

   double (*cosine)(double);

   char *error;

   handle = dlopen ("/lib/libm.so.6", RTLD_LAZY);

   if (!handle) {

   fputs (dlerror(), stderr);

   exit(1);

   }

   cosine = dlsym(handle, "cos");

   if ((error = dlerror()) != NULL) 网管联盟www.bitsCN.com

   {

   fputs(error, stderr);

   exit(1);

   }

   printf ("%f ", (*cosine)(2.0));

   dlclose(handle);

  }

 

  如果这个程序名字叫foo.c,那么用下面的命令来编译:

 

  gcc -o foo foo.c -ldl

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值