这个问题困扰我很久了,我有一段用于编译成动态库的源代码如下:
文件名是: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