首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 服务器 > 其他服务器 >

solaris上用gcc编译出的动态库老是无法找到导出函数解决办法

2012-02-04 
solaris上用gcc编译出的动态库老是无法找到导出函数这个问题困扰我很久了,我有一段用于编译成动态库的源代

solaris上用gcc编译出的动态库老是无法找到导出函数
这个问题困扰我很久了,我有一段用于编译成动态库的源代码如下:
文件名是:libtest.c

#include <stdio.h>
#include "libtest.h"

int interp_dll(char* filename)
{
  printf("invoke successful");
  return 0;
}

相应的头文件libtest.h很简单:
#ifndef _LIB_TEST_H
#define _LIB_TEST_H

int interp_dll(char* filename);

#endif

我用于调用动态库函数的的代码如下:

#include <dlfcn.h>
#include <stdio.h>
#include <errno.h>

int (*interp_f)(char* filename);

int main(int argc, char* argv[])
{
  void* dllhandle;
  
  char* libname = argv[1];
  printf("library name is %s\n",libname); 
  dllhandle = dlopen(libname ,RTLD_LAZY);


  if(!dllhandle)
  {
  char* err = dlerror();
  printf("Load library failure.error:%s\n", err);
  return 0;
  }
  printf("load library successful");

  interp_f = (int(*)(char*))dlsym(dllhandle,"interp_dll");
  if(!interp_f)
  {
  char* err = dlerror();
  printf("can not locate the specify function \"interp_dll\",error:%s\n",err);
  return 0;
  }
  int ret = interp_f("selt_calculation.ini");

  return ret;
}

文件名是dlltest.c


我用两种方式来生成所需要的动态库:

方法一:
1.先生成obj文件:gcc -c -o libtest.o libtest.c
生成了 libtest.o文件。
2.生成动态库libtest.so文件: gcc -G -o libtest.so libtest.o
这样我的调用代码可以正常加载动态库并成功执行interp_dll函数。

方法二:
1.先生成obj文件:gcc -c -o libtest.o libtest.c
生成了 libtest.o文件。
2.生成静态库文件:ar crv libtest.a libtest.o
生成了 libtest.a的静态库文件。
3.将静态库文件生成动态库文件: gcc -G -o libtest.so libtest.a
生成的动态库文件可以正常加载,但是问题出现了,调用的代码无法定位interp_dll函数,报错如下:

can not locate the specify function "interp_dll",error:ld.so.1: dlltest: fatal: interp_dll: can't find symbol

哪位大哥帮忙解决一下这个问题啊,因为公司给的代码是静态库,现在我想做成动态库然后调用,但是总是碰到这个错误,快急死我了。谢谢啦!!!!!!!!!!!!!!!!!!!!

我的分不多,麻烦知道的大哥大姐帮帮小弟啊。

[解决办法]
gcc -I<include_path> -L<lib_path>

For example,

#include <your_header.h>

/home/you/your_header.h

your_header.h <--- your_dll.so

/home/you/lib/your_dll.so

Then, you should use

gcc -I/home/you -L/home/you

热点排行