当前位置: 代码迷 >> Solaris >> solaris下用gcc编译出的动态库老是无法找到导出函数
  详细解决方案

solaris下用gcc编译出的动态库老是无法找到导出函数

热度:7470   发布时间:2013-02-26 00:00:00.0
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