日期:2014-05-16  浏览次数:20658 次

打开.so链接库出现错误
handle = dlopen("./libReader.so",RTLD_LAZY);
  if(handle==NULL)
  {
  cout<<"dlopen出错";
  return 0;
  }


  SingleTagIdentify= (short (*)(HANDLE hCom, unsigned int TagType, UBYTE *value))dlsym(handle,"SingleTagIdentify");
  const char* err=dlerror();
  if(err)
  {
  cerr<<err<<endl;
  dlclose(handle);
  cout<<"SingleTagIdentify error";
  return 0;
  }
以上是我的代码,下面是调用dlerror()返回的错误:
/libReader.so: undefined symbol: SingleTagIdentify
SingleTagIdentify error。请问这是为什么啊?

我用nm命令查看libReader.so里面有SingleTagIdentify()这个函数的

zhengjinping@zhengjinping-K42JE:~/rfid$ nm -D libReader.so 
……
00002920 T _Z17SetReaderDateTimeiP8DATETIME
00003fc0 T _Z17SingleTagIdentifyijPh
00002fd0 T _Z18Gen2ReadTagWithEpcihjhPhhhS_
……
请各位指导一下这是因为什么原因?那个库是我买RDIF读卡器时候文件资料附带的,里面不会有什么错误。

------解决方案--------------------
在你引用的头文件里,加上extern C试试
extern C
{
#include "你的头文件"
}
------解决方案--------------------
C++编译的.so命名是C++风格,dlsym需要你传入.so里那个函数名,不是代码里那个名字。

用C++编译.so的时候把函数声明以及定义均注明为extern "C"的即可。