访问共享库时没有可用的源错误

No source available error in accessing shared library

本文关键字:错误 访问共享      更新时间:2023-10-16

我的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.sodlopen在查找文件时不会自动添加lib前缀,您需要提供共享对象的实际文件名。