tesseract-4.x包在ARM64环境编译安装过程

【说明】

在ARM64环境安装一个包的思路有两个:

第一,安装现有的rpm包

第二,下载源码在本地环境编译,安装编译后的rpm包

【方法一】

我们先尝试第一种方法,安装现有的rpm包。如下

发现需要升级基础包glibc,一般需要升级glibc的话不建议再往下执行了。换第二种方法。

【方案二】

下载源码包tesseract-4.1.0~git3915-1.1.src.rpm

Wget https://download.opensuse.org/repositories/home:/Alexander_Pozdnyakov/CentOS_7/src/tesseract-4.1.0~git3915-1.1.src.rpm

说明,之所以没有从github上直接取源码,是因为该包在github上没有对应版本的spec文件。而opensuse工程直接有配套的可用的源码和spec。

安装源码包,rpm -ivh tesseract-4.1.0~git3915-1.1.src.rpm

进到编译目录,cd /root/rpmbuild/SPECS/

开始编译,rpmbuild -ba tesseract.spec

出现下面的编译依赖问题

说明,如果依赖包是xxx-devel,那一定要安装对应的xxx包,因为devel包依赖主包。

先尝试使用yum安装上面的依赖。

Yum install xxxx

六个包没有一个可以用yum安装的。

那就从http://rpmfind.net网站查找是否有包了。

如上图,1的位置输入包名称leptonica,2的位置输入架构aarch64

找到了,我一般下载满足条件的最低版本的rpm包,因为低版本依赖包的版本也较低,如果依赖环境上的基础包,那当前环境满足的可能性更大。

下载leptonica-1.72-2.el7.aarch64.rpm,leptonica-devel-1.72-2.el7.aarch64.rpm包,注意,两个包的版本要求一致!

wget http://rpmfind.net/linux/epel/7/aarch64/Packages/l/leptonica-1.72-2.el7.aarch64.rpm

Wget http://rpmfind.net/linux/epel/7/aarch64/Packages/l/leptonica-devel-1.72-2.el7.aarch64.rpm


安装leptonica-1.72-2.el7.aarch64.rpm包,

rpm -ivh leptonica-1.72-2.el7.aarch64.rpm

如上报错信息,存在so文件依赖。

从rpmfind网站获取libwebp-0.6.1-8.fc28.aarch64.rpm包,安装解决上述so文件依赖。

wget http://rpmfind.net/linux/fedora/linux/releases/28/Everything/aarch64/os/Packages/l/libwebp-0.6.1-8.fc28.aarch64.rpm

先不要安装,先查看rpm包中so文件的版本是否匹配

rpm -qlp libwebp-0.6.1-8.fc28.aarch64.rpm

上图看到libwebp.so.7与依赖的libwebp.so.4版本不一致。说明这个包不可用。该rpm包是rpmfind网站最低版本的了。那就从其它地方找更低版本的libwebp包来安装。

下载libwebp包的源码包

Wget https://download.opensuse.org/repositories/home:/Alexander_Pozdnyakov/RHEL_7/src/libwebp-0.3.0-7.1.src.rpm

安装编译,编译过程报错,依赖太多基础包,比如libjb

查看昨天安装tesseract-3.004.00版本的环境,rpm -qf /usr/lib64/libwebp.so.4

查询到libwebp.so.4所属的rpm包版本信息,

尝试从华为镜像下载该rpm包。

Wget https://mirrors.huaweicloud.com/euler/2.3/os/aarch64/Packages/libwebp-0.3.0-5.aarch64.rpm

安装,成功。

安装leptonica及leptonica-devel包。

再重新尝试编译tesseract源码,出现了下面./configure阶段的报错

Configure对leptonica包的版本有依赖。

卸载已经安装好的leptonica及leptonica-devel包。重新下载高版本rpm安装。

下载leptonica-1.75.3-2.fc28.aarch64.rpm和leptonica-1.78.0-1.fc30.aarch64.rpm

安装时出现下面的报错

基础包的升级依赖。此时,这条路又走不通了。

下载leptonica的源码来编译吧。

Wget

编译tesseract源码,出现下面的报错:

宏没有定义。到github Issue去查找,有一样的问题。是centos环境的libicu版本低于52.需要升级。

下载libicu安装包,安装,出现下面的报错信息

Libstdc.so.6(CXXABI_1.3.8) is needed by libicuxxx.rpm

使用strings /usr/lib64/libstdc++.so.6 | grep CXXABI查看当前环境的CXXABI版本信息

果真只到1.3.6,没有1.3.8.那我们就需要安装更高版本的libstdc++包了。

Wget http://rpmfind.net/linux/fedora/linux/releases/28/Everything/aarch64/os/Packages/l/libstdc++-8.0.1-0.20.fc28.aarch64.rpm

rpm -ivh libstdc++-8.0.1-0.20.fc28.aarch64.rpm

报错,libstdc++.so.6文件与低版本的libstdc++冲突,此类冲突可以通过先卸载低版本,再安装高版本包解决。也可以直接--force安装。

安装好libstdc++版本后,再安装libicu包。

开始编译tesseract源码吧。但愿这次没有问题了

还是出错了。

/usr/lib/gcc/aarch64-redhat-linux/4.8.5/../../../../lib64/libicui18n.so: undefined reference to `__cxa_throw_bad_array_new_length@CXXABI_1.3.8'

查看错误,明显是libicui18n.so文件错误。那我们使用指定so路径的方式。-L/usr/lib64/libicui18n.so

vi src/training/Makefile

修改 -licui18n和-licuuc为-L/usr/lib64/libicui18n.so和-L/usr/lib64/libicuuc.so

重新编译,上述问题解决。

然而出现了新的问题,如下:

[root@arm-app-0003 training]#  g++ -g -O2 -std=c++11 -o .libs/combine_lang_model  combine_lang_model.o  ./.libs/libtesseract_training.a ./.libs/libtesseract_tessopt.a -L/usr/lib64/libicui18n -L/usr/lib64/libicuuc -licudata ../api/.libs/libtesseract.so -llept -lpthread -fopenmp -Wl,-rpath -Wl,//lib -DCMAKE_EXE_LINKER_FLAGS=’-static-libstdc++’

./.libs/libtesseract_training.a(unicharset_training_utils.o): In function `tesseract::SetupBasicProperties(bool, bool, UNICHARSET*)':

/root/small7/tesseract-4/tesseract_4.0.0/src/training/unicharset_training_utils.cpp:64: undefined reference to `u_isalpha_60'

/root/small7/tesseract-4/tesseract_4.0.0/src/training/unicharset_training_utils.cpp:65: undefined reference to `u_islower_60'

/root/small7/tesseract-4/tesseract_4.0.0/src/training/unicharset_training_utils.cpp:66: undefined reference to `u_isupper_60'

/root/small7/tesseract-4/tesseract_4.0.0/src/training/unicharset_training_utils.cpp:67: undefined reference to `u_isdigit_60'

/root/small7/tesseract-4/tesseract_4.0.0/src/training/unicharset_training_utils.cpp:68: undefined reference to `u_ispunct_60'

/root/small7/tesseract-4/tesseract_4.0.0/src/training/unicharset_training_utils.cpp:79: undefined reference to `uscript_getScript_60'

/root/small7/tesseract-4/tesseract_4.0.0/src/training/unicharset_training_utils.cpp:79: undefined reference to `uscript_getName_60'

/root/small7/tesseract-4/tesseract_4.0.0/src/training/unicharset_training_utils.cpp:108: undefined reference to `u_charMirror_60'

/root/small7/tesseract-4/tesseract_4.0.0/src/training/unicharset_training_utils.cpp:92: undefined reference to `u_toupper_60'

/root/small7/tesseract-4/tesseract_4.0.0/src/training/unicharset_training_utils.cpp:92: undefined reference to `u_tolower_60'

/root/small7/tesseract-4/tesseract_4.0.0/src/training/unicharset_training_utils.cpp:112: undefined reference to `u_charDirection_60'

./.libs/libtesseract_training.a(icuerrorcode.o): In function `tesseract::IcuErrorCode::~IcuErrorCode()':

/root/small7/tesseract-4/tesseract_4.0.0/src/training/icuerrorcode.cpp:22: undefined reference to `icu_60::ErrorCode::~ErrorCode()'

./.libs/libtesseract_training.a(icuerrorcode.o): In function `tesseract::IcuErrorCode::~IcuErrorCode()':

/root/small7/tesseract-4/tesseract_4.0.0/src/training/icuerrorcode.cpp:26: undefined reference to `icu_60::UMemory::operator delete(void*)'

./.libs/libtesseract_training.a(icuerrorcode.o): In function `tesseract::IcuErrorCode::handleFailure() const':

/root/small7/tesseract-4/tesseract_4.0.0/src/training/icuerrorcode.h:52: undefined reference to `icu_60::ErrorCode::errorName() const'

好多的错误呀!

我们第一步先去找第一个undefined函数是哪个文件和so里面定义的。


不断总结输出是程序员必备成长技能。如何写的更清醒,欢迎来007不出局一起践行写作*^_^*

图片发自简书App

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容