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

时间:2015-06-24 09:26:38

标签: c++ eclipse shared-libraries ubuntu-14.04

我的Eclipse IDE中有两个项目。我的操作系统是Ubuntu。一个是应用程序项目,另一个是共享库项目。我已经链接了link中讨论的所有路径和库需求。但是当我调试时,我得到的错误为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;
}

我用objdumb检查过输出如下

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

1 个答案:

答案 0 :(得分:0)

我看到有两个可能的问题。

第一个是,为此,我只是猜测,你把共享对象放在与加载共享对象的可执行文件相同的路径中,并认为dlopen会查看当前的进程目录。 The manual page

  

如果filename包含斜杠(&#34; /&#34;),则将其解释为(相对或绝对)路径名。否则,动态链接器将按如下方式搜索库...

然后它列出了函数查找共享对象的位置,其中包括: /usr/lib

如果库不在dlopen查找的路径中,则找不到共享对象。

第一个问题的简单解决方案是使用绝对或相对路径,例如

dlopen("./OCR.so", RTLD_LAZY);

这将查看进程当前目录(可能与可执行程序所在的目录不同)。

第二个问题是您命名了共享对象libOCR.so,并要求dlopen查找OCR.sodlopen在查找文件时不会自动添加lib前缀,您需要提供共享对象的实际文件名。