在 C++ 中创建共享库以与 Python 集成
Create a shared library in C++ to integrate with Python
我需要在 C++ 中使用此代码生成 .so
,以便与 Python 集成:
#include <tesseract/baseapi.h>
#include <leptonica/allheaders.h>
// sudo apt-get install libtesseract-dev
// sudo apt-get install libleptonica-dev
extern "C" void read(void) {
Pix *image = pixRead("/home/macabeus/test.jpg");
tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();
api->Init(NULL, "eng");
api->SetImage(image);
api->SetVariable("save_blob_choices", "T");
api->SetVariable("tessedit_char_whitelist", "QWERTYUIOPASDFGHJKLZXCVBNM");
api->Recognize(NULL);
tesseract::ResultIterator* ri = api->GetIterator();
tesseract::PageIteratorLevel level = tesseract::RIL_SYMBOL;
if(ri != 0) {
do {
const char* symbol = ri->GetUTF8Text(level);
if(symbol != 0) {
tesseract::ChoiceIterator ci(*ri);
do {
const char* choice = ci.GetUTF8Text();
printf("%s(%f)..", choice, ci.Confidence());
} while(ci.Next());
printf("--> recognized as '%s'\n", symbol);
}
delete[] symbol;
} while((ri->Next(level)));
}
}
我在终端中使用以下命令生成文件.so
:
g++ main.cpp -c -fPIC -o main.o
g++ -shared -o main.so main.o
然后生成文件
main.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=616e7e8e8a094b9c075a21897e8c5d32fc6ea159, not stripped
所以,在Python中,我使用ctypes来使用共享对象:
import ctypes
c_lib_test = ctypes.CDLL('cppcodetesseract/main.so')
但是,当 运行 代码在 Python 中时,我收到以下错误消息:
[...]
File "/home/macabeus/ApenasMeu/Dropbox/Python/Extending with C/main.py", line 5, in <module>
c_lib_tes = ctypes.CDLL('cppcodetesseract/main.so')
File "/usr/lib/python3.4/ctypes/__init__.py", line 351, in __init__
self._handle = _dlopen(self._name, mode)
OSError: cppcodetesseract/main.so: undefined symbol: _ZN9tesseract14ChoiceIterator4NextEv
如何解决?我在其他未使用 tesseract 或 leptonica 的 C++ 代码中取得了成功。但是当我使用这些库时,我无法成功。
我解决了我的问题:cmake
我创建文件 CMakeList.txt
使用:
add_library(foo SHARED main.cpp)
target_link_libraries (foo lept tesseract)
因此我使用了命令 cmake .
和 make
。
然后去生成文件libfoo.so
。效果很好。
我需要在 C++ 中使用此代码生成 .so
,以便与 Python 集成:
#include <tesseract/baseapi.h>
#include <leptonica/allheaders.h>
// sudo apt-get install libtesseract-dev
// sudo apt-get install libleptonica-dev
extern "C" void read(void) {
Pix *image = pixRead("/home/macabeus/test.jpg");
tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();
api->Init(NULL, "eng");
api->SetImage(image);
api->SetVariable("save_blob_choices", "T");
api->SetVariable("tessedit_char_whitelist", "QWERTYUIOPASDFGHJKLZXCVBNM");
api->Recognize(NULL);
tesseract::ResultIterator* ri = api->GetIterator();
tesseract::PageIteratorLevel level = tesseract::RIL_SYMBOL;
if(ri != 0) {
do {
const char* symbol = ri->GetUTF8Text(level);
if(symbol != 0) {
tesseract::ChoiceIterator ci(*ri);
do {
const char* choice = ci.GetUTF8Text();
printf("%s(%f)..", choice, ci.Confidence());
} while(ci.Next());
printf("--> recognized as '%s'\n", symbol);
}
delete[] symbol;
} while((ri->Next(level)));
}
}
我在终端中使用以下命令生成文件.so
:
g++ main.cpp -c -fPIC -o main.o
g++ -shared -o main.so main.o
然后生成文件
main.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=616e7e8e8a094b9c075a21897e8c5d32fc6ea159, not stripped
所以,在Python中,我使用ctypes来使用共享对象:
import ctypes
c_lib_test = ctypes.CDLL('cppcodetesseract/main.so')
但是,当 运行 代码在 Python 中时,我收到以下错误消息:
[...]
File "/home/macabeus/ApenasMeu/Dropbox/Python/Extending with C/main.py", line 5, in <module>
c_lib_tes = ctypes.CDLL('cppcodetesseract/main.so')
File "/usr/lib/python3.4/ctypes/__init__.py", line 351, in __init__
self._handle = _dlopen(self._name, mode)
OSError: cppcodetesseract/main.so: undefined symbol: _ZN9tesseract14ChoiceIterator4NextEv
如何解决?我在其他未使用 tesseract 或 leptonica 的 C++ 代码中取得了成功。但是当我使用这些库时,我无法成功。
我解决了我的问题:cmake
我创建文件 CMakeList.txt
使用:
add_library(foo SHARED main.cpp)
target_link_libraries (foo lept tesseract)
因此我使用了命令 cmake .
和 make
。
然后去生成文件libfoo.so
。效果很好。