访问共享库时没有可用的源错误
No source available error in accessing shared library
我的Eclipse IDE中有两个项目。我的操作系统是Ubuntu。一个是应用程序项目,另一个是共享库项目。我已经链接了链接中讨论的所有路径和libs需求。但当我调试时,我得到了错误为No source available for "0x0"
。访问共享库对象时,iOCR* pOCR = (iOCR*)create();
发生错误。我的链接有什么问题?附上了我的共享库代码和应用程序代码。
共享库头文件
#ifndef OCR_DLL_H_
#define OCR_DLL_H_
#include <opencv/cv.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <tesseract/baseapi.h>
#include <iostream>
#include "Define.h"
using namespace cv;
namespace VIDEOANALYTICS_PLATFORM {
class iOCR{
public:
virtual ~iOCR(){}
virtual int preProcessing(Mat &img) = 0;
virtual int textExtraction(Mat &img) = 0;
};
class OCR : public iOCR{
public:
OCR(){}
~OCR(){ ; }
int preProcessing(Mat &img);
int textExtraction(Mat &img);
private:
};
}
#endif /* OCR_DLL_H_ */
共享库cpp
#include "OCR_dll.h"
namespace VIDEOANALYTICS_PLATFORM {
extern "C" iOCR* create_object(){
iOCR *p = new OCR();
return p;
}
extern "C" void destroy_object( iOCR* object )
{
delete object;
}
int OCR::preProcessing(Mat &img){
return SUCCESS;
}
int OCR::textExtraction(Mat &img){
return SUCCESS;
}
}
应用程序main.cpp
#include <stdio.h>
#include "OCR_dll.h"
#define SUCCESS 0
#define FILE_ERROR 1
#define HTTP_ERROR 2
#define THREAD_ERROR 3
using namespace VIDEOANALYTICS_PLATFORM;
using namespace cv;
void *readImage(void *ptr);
void *postHTTP(void *ptr);
int main(int argc, char *argv[])
{
// on Linux, use "./myclass.so"
void* handle = dlopen("OCR.so", RTLD_LAZY);
iOCR* (*create)();
void (*destroy)(iOCR*);
create = (iOCR* (*)())dlsym(handle, "create_object");
destroy = (void (*)(iOCR*))dlsym(handle, "destroy_object");
iOCR* pOCR = (iOCR*)create();
if(pOCR){
destroy( pOCR );
}//if(pOCR)
dlclose(handle);
return 0;
}
我用objdum进行了检查,结果如下所示
cdc@cdc-desktop:~/workspace/OCR/Debug$ objdump -TC libOCR.so
libOCR.so: file format elf32-i386
DYNAMIC SYMBOL TABLE:
00000000 DF *UND* 00000000 GLIBC_2.1.3 __cxa_atexit
00000000 w D *UND* 00000000 __gmon_start__
00000000 w D *UND* 00000000 _Jv_RegisterClasses
00000000 DF *UND* 00000000 GLIBCXX_3.4 operator delete(void*)
00000000 DF *UND* 00000000 GLIBCXX_3.4 std::ios_base::Init::Init()
00000000 DF *UND* 00000000 GLIBCXX_3.4 std::ios_base::Init::~Init()
00000000 w D *UND* 00000000 _ITM_deregisterTMCloneTable
00000000 w D *UND* 00000000 _ITM_registerTMCloneTable
00000000 DO *UND* 00000000 CXXABI_1.3 vtable for __cxxabiv1::__class_type_info
00000000 DF *UND* 00000000 CXXABI_1.3 __cxa_pure_virtual
00000000 DF *UND* 00000000 GLIBCXX_3.4 operator new(unsigned int)
00000000 DO *UND* 00000000 CXXABI_1.3 vtable for __cxxabiv1::__si_class_type_info
00000000 w DF *UND* 00000000 GLIBC_2.1.3 __cxa_finalize
00000c95 g DF .text 00000020 Base destroy_object
00000dc4 w DF .text 0000001e Base VIDEOANALYTICS_PLATFORM::OCR::~OCR()
00000de4 g DF .fini 00000000 Base _fini
00000d94 w DF .text 00000030 Base VIDEOANALYTICS_PLATFORM::OCR::~OCR()
00000d94 w DF .text 00000030 Base VIDEOANALYTICS_PLATFORM::OCR::~OCR()
00000d4c w DF .text 0000001e Base VIDEOANALYTICS_PLATFORM::iOCR::~iOCR()
00000cc0 g DF .text 0000000a Base VIDEOANALYTICS_PLATFORM::OCR::textExtraction(cv::Mat&)
00000d78 w DF .text 0000001c Base VIDEOANALYTICS_PLATFORM::OCR::OCR()
00000aec g DF .init 00000000 Base _init
00000e40 w DO .rodata 00000020 Base typeinfo name for VIDEOANALYTICS_PLATFORM::OCR
00000d78 w DF .text 0000001c Base VIDEOANALYTICS_PLATFORM::OCR::OCR()
00003018 g D .bss 00000000 Base __bss_start
00000d26 w DF .text 00000025 Base VIDEOANALYTICS_PLATFORM::iOCR::~iOCR()
00000d6a w DF .text 0000000e Base VIDEOANALYTICS_PLATFORM::iOCR::iOCR()
00000d26 w DF .text 00000025 Base VIDEOANALYTICS_PLATFORM::iOCR::~iOCR()
0000301c g D .bss 00000000 Base _end
00000e18 w DO .rodata 00000018 Base vtable for VIDEOANALYTICS_PLATFORM::iOCR
00000e30 w DO .rodata 0000000c Base typeinfo for VIDEOANALYTICS_PLATFORM::OCR
00000d6a w DF .text 0000000e Base VIDEOANALYTICS_PLATFORM::iOCR::iOCR()
00000cb6 g DF .text 0000000a Base VIDEOANALYTICS_PLATFORM::OCR::preProcessing(cv::Mat&)
00000e00 w DO .rodata 00000018 Base vtable for VIDEOANALYTICS_PLATFORM::OCR
00003018 g D .data 00000000 Base _edata
00000e84 w DO .rodata 00000008 Base typeinfo for VIDEOANALYTICS_PLATFORM::iOCR
00000c6c g DF .text 00000029 Base create_object
00000e60 w DO .rodata 00000021 Base typeinfo name for VIDEOANALYTICS_PLATFORM::iOCR
我看到了两个可能的问题。
首先,我只是猜测,您将共享对象放在与加载共享对象的可执行文件相同的路径中,并认为dlopen
将在进程当前目录中查找。手册页面上说
如果文件名包含斜线("/"),则将其解释为(相对或绝对)路径名。否则,动态链接器将按如下方式搜索库。。。
然后它列出了函数将在哪里查找共享对象,其中包括例如/usr/lib
。
如果库不在dlopen
查找的路径中,则将找不到共享对象。
第一个问题的简单解决方案是使用绝对或相对路径,例如
dlopen("./OCR.so", RTLD_LAZY);
这将在进程当前目录中查找(该目录可能与可执行程序所在的目录不同)。
第二个问题是,您将共享对象命名为libOCR.so
,并要求dlopen
查找OCR.so
。dlopen
在查找文件时不会自动添加lib
前缀,您需要提供共享对象的实际文件名。
相关文章:
- 执行错误访问 遍历向量
- 错误访问 读入对象后
- 访问共享内存而不使用易失性、std::atomic、信号量、互斥锁和自旋锁
- OpenMP:当我按线程 ID 访问共享变量时,我是否需要一个关键部分
- 如何修复 CopyFile() 错误 5 - 访问被拒绝错误
- 访问共享内存时出现读取访问冲突
- 如何处理加载错误的共享库版本的情况
- CreateFile 在尝试打开目录进行读取时始终返回错误 5(访问被拒绝)
- 范围检查检测到的检测代码和超出范围的错误访问
- 多个线程访问共享资源
- 无法从C 代码访问C共享库方法
- 查找() 上的 C++ 错误访问错误
- 从测试程序访问共享库中具有静态私有字段的类
- 错误访问另一个插件中的类(错误:未定义的引用)
- 加入线程后,是访问共享数据的数据竞赛吗?
- C STD ::排序Intel编译器错误:访问违规
- C 程序运行为Apache CGI程序无法通过SHMGET访问共享存储器
- libcurl、OSX、curl_multi_执行错误访问
- 尝试使用pthreads访问共享数据数组时,出现“无法访问内存地址”错误
- 访问共享库时没有可用的源错误