我写了一个库,使用tesseract.dll
和leptonica.dll
与动态加载(LoadLibrary
在Windows和dlopen
在Linux)。 Tesseract在内部也使用了leptonica,但这是隐式加载而不是动态加载。
我的图书馆运作良好的窗口,但是当它移植到Ubuntu的,当它的tesseract LIB调用leptonica功能出现segfaults。可能是由重复的符号引起的。
如果我将leptonica加载更改为隐式加载(通过将-llept
添加到LDFLAGS
),则在tesseract调用第一个leptonica函数(convertOnBigEnd16
)时出现分段错误。
如何加载libray与dlopen
,这已经装载了内隐加载?
我已经尝试了以下内容。
dlopen("liblept.so", RTLD_LAZY|RTLD_NOLOAD|RTLD_GLOBAL); //(dlopen manual says ' a library that was previously loaded with RTLD_LOCAL can be reopened with RTLD_NOLOAD | RTLD_GLOBAL')
dlopen("liblept.so", RTLD_LAZY|RTLD_LOCAL);
但是所有试验都是分段错误(所有dlopen
和dlsym
返回成功,并且函数指针是正常的,但会导致段错误)
[bliefly其他试验]
libtesseract.so
的隐式加载+ liblept.so
的隐式加载在lib中:运行良好
dlopen
的{{1}} + libtesseract.so
的{{1}}在主:工作良好
dlopen
的{{1}} + liblept.so
的{{1}}在LIB:SEG故障
为什么只有最后一种情况下使段错误?
在故障时,leptonica函数指针不为空,调试器提示
dlopen
和反汇编代码不匹配libtesseract.so
的输出。
如何加载与libray dlopen
在LIB后它已经被加载implictly?