mini2440基於qtopia2.2的電子詞典ZBEDIC的移植過程
阿新 • • 發佈:2019-02-05
知道這個ZBEDIC原先是使用在Sharp Zaurus 這個PDA的qtopia上面的,那麼移植到mini2440上面去,也是可以的,不過得經過下面這些修改才可以:
依據這個http://bedic.sourceforge.net/doc/zbedic-install.html地址和zbedic原始碼包裡面README上面的提示,我們首先得移植sqlite3到開發板上面,我使用的是以前在mini2440上移植minigui電子選單時下載的一個sqlite-3.6.12,大家可以在網上找找,用別的版本,可能會有錯誤。
一、sqlite的移植
1. 解壓sqlite-3.6.12,進入sqlite原始碼目錄,執行命令:
./configure --host=arm-linux --prefix=/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/lib --disable-tcl
來生成Makefile檔案。
2. 執行 make 對 sqlite 原始碼進行編譯。
3. 執行 make install 進行安裝,安裝到/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi 這個目錄的目的是為了以後編譯 libbedic 的時候使用
-lbedic 這個連結lib庫選項。
二、libbedic 的編譯
1. 解壓:
mkdir libbedic
tar xzvf libbedic_1.1-0.tgz -C libbedic
2. 修改 Makefile ,在 ifeq ($(ARCH), arm) 語句前,新增 ARCH = arm
3. (1) 執行 make , 遇到如下錯誤:
src/shcm.cpp:64: error: 'calloc' was not declared in this scope
那麼就在 src/shcm.cpp 開頭新增 #include <stdlib.h> 或者 #include <cstdlib> 都可。
(2)繼續 make ,又有下面的錯誤:
src/dynamic_dictionary.cpp:28:21: error: sqlite3.h: No such file or directory
很簡單,只需要 cp sqlite-3.6.12-arm/sqlite3.h ./src/ ,然後修改src/ dynamic_dictionary.cpp 第28行,將 #include<sqlite3.h> 修改為 #include"sqlite3.h"
,
(3)繼續 make , 又遇到如下錯誤:
src/dynamic_dictionary.cpp:69: error: extra qualification 'SQLiteDictionary::' on member 'findNext'
那麼就把 src/dynamic_dictionary.cpp 第69行 findNext 前面的 SQLiteDictionary::
刪除繼續 make, 後面又遇到類似的錯誤,用同樣的方法即可。
(4)make 後,又遇到的錯誤:
src/format_entry.cpp:53: error: 'strcmp' was not declared in this scope
那麼就到 src/format_entry.cpp 前面把 #include <string> 修改為 #include <string.h> 或 #include <cstring> 都可
src/xerox.cpp:244: error: 'LONG_MAX' was not declared in this scope
那麼就到 src/xerox.cpp 前面新增 #include <limits.h> 或 #include <climits>
4. 當libbedic根檔案中出現 objs.arm 資料夾,就表示編譯成功了。
三、 zbedic 的編譯。
1. 在libbedic 資料夾上層,解壓 zbedic 原始碼包,進入 zbedic 資料夾,閱讀 README,但是這裡面的編譯說明是為 Sharp Zaurus
這個PDA QTOPIA環境做準備的,不適合mini2440的qtopia,此時就需要修改原始碼,並以友善提供的arm-qtopia內的工具作為開發環境。
2. 進入 zbedic 的 src 資料夾中執行命令:
(1) 設定環境變數
source /opt/FriendlyARM/mini2440/arm-qtopia/qtopia-2.2.0-FriendlyARM/setQpeEnv
(2) 建立 pro 專案檔案,生成 src.pro
qmake -project
(3) 執行 qmake -spec qws/linux-arm-g++ -o Makefile.target *.pro 生成 Makefile.target
遇到以下錯誤:
Project ERROR: Please set a target in /media/sf_cyx/Application/zbedic-libbedic/libbedic/src
解決方法: 修改 src.pro 檔案內容,在開頭新增 TARGET = zbedic 之後,重新執行“ qmake -spec qws/linux-arm-g++ -o Makefile.target *.pro”命令
(4) 執行 make -f Makefile.target clean 清除以前的目標檔案
(5) 執行 make -f Makefile.target 遇到以下錯誤:
zbedic.h:37:19: error: bedic.h: No such file or directory
In file included from helpdialog.cpp:30:
zbedic.h:68: error: 'StaticDictionary' was not declared in this scope
zbedic.h:68: error: template argument 1 is invalid
zbedic.h: In member function 'int DictList::compareItems(void*, void*)':
zbedic.h:73: error: 'StaticDictionary' was not declared in this scope
............
解決方法: 從 libbedic 的 include 目錄中將所以標頭檔案拷貝到 zbedic 的 src 目錄下。
(6) 繼續執行 make -f Makefile.target 遇到以下錯誤:
helpdialog.cpp: In constructor 'HelpDialog::HelpDialog(QWidget*)':
helpdialog.cpp:52: error: expected ')' before 'PREFIX_PATH'
make: *** [.obj/release-shared/helpdialog.o] Error 1
解決方法: 將 helpdialog.cpp 第52行的 browser->setSource( "file:://" PREFIX_PATH "/share/doc/zbedic/zbedic.html" ); 修改為 browser->setSource( "/usr/share/doc/zbedic/zbedic.html" );
(7) 繼續執行 make -f Makefile.target 遇到以下錯誤:
settings.cpp: In constructor 'ZBEDicSettings::ZBEDicSettings(QWidget*)':
settings.cpp:142: error: expected ')' before 'VERSION'
settings.cpp: In member function 'void ZBEDicSettings::updateFontSizes()':
settings.cpp:425: error: 'abs' was not declared in this scope
make: *** [.obj/release-shared/settings.o] Error 1
解決方法: 將 settings.cpp 第142行的 setCaption( tr( "ZBEDic Settings (v. " VERSION ")" ) ); 修改為 setCaption( tr( "ZBEDic Settings (v.1.2-2 )" ) );
並在 settings.cpp 的開頭 新增 #include <stdlib.h>
(8) 繼續執行 make -f Makefile.target 遇到以下錯誤:
.obj/release-shared/abstract_config.o: In function `AbstractConfig::setGroup(char const*)':
abstract_config.cpp:(.text+0x4f0): undefined reference to `Config::setGroup(QString const&)'
.obj/release-shared/abstract_config.o: In function `AbstractConfig::writeEntry(char const*, bool)':
abstract_config.cpp:(.text+0x528): undefined reference to `Config::writeEntry(QString const&, bool)'
.................
.obj/release-shared/settings.o: In function `ZBEDicSettings::createNewDic()':
settings.cpp:(.text+0xc6c): undefined reference to `createSQLiteDictionary(char const*, char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'
.obj/release-shared/zbedic.o: In function `ZBEDic::createHybridDic()':
zbedic.cpp:(.text+0xbb0): undefined reference to `createHybridDictionary(char const*, StaticDictionary*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'
...................
../../libbedic/objs.arm/libbedic.a(dynamic_dictionary.o): In function `SQLiteDictionary::getDB()':
/media/sf_cyx/Application/zbedic-libbedic/libbedic/src/dynamic_dictionary.cpp:186: undefined reference to `sqlite3_open'
/media/sf_cyx/Application/zbedic-libbedic/libbedic/src/dynamic_dictionary.cpp:192: undefined reference to `sqlite3_create_collation'
...................
解決方法: 將 Makefile.target 中的
LIBS = $(SUBLIBS) -luuid -L/opt/FriendlyARM/mini2440/arm-qtopia/qtopia-2.2.0-FriendlyARM/qtopia/lib -L/opt/FriendlyARM/mini2440/arm-qtopia/qtopia-2.2.0-FriendlyARM/qt2/lib -lqte
修改為:
LIBS = $(SUBLIBS) -luuid -L/opt/FriendlyARM/mini2440/arm-qtopia/qtopia-2.2.0-FriendlyARM/qtopia/lib -lqpe -L/opt/FriendlyARM/mini2440/arm-qtopia/qtopia-2.2.0-FriendlyARM/qt2/lib -lqte -L../../libbedic/objs.arm -lbedic -lsqlite3
至此,zbedic 完全編譯成功,以上錯誤的修正,還得感謝寫
《交叉編譯基於qt/e 2.3.10 的qtopia應用程式》
這篇文章的仁兄。
最後,移植 zbedic 到mini2440開發板的過程,可以參考一下
我這裡再提供一下我自己安裝zbedic的方法:
介面中“設定”這一頁的“軟體包”按鈕,選擇“Install from Documents”後,點選Next,之後管理器會找到
3. 但是實際上zbedic 並不是安裝到 mini2440 設定的 /opt/Qtopia 資料夾內的,而是在 /opt/QtPalmtop/
資料夾內的,此時只需要 cp -rf /opt/QtPalmtop/* /opt/Qtopia/ ,然後再把我們自己編譯好的 zbedic
替換掉 /opt/Qtopia/bin/ 內的zbedic ,最好再 chmod a+x zbedic 將zbedic的許可權設為可執行。
4. 期間還得把 我們自己編譯的 libsqlite3.so.0 也拷貝到 /opt/Qtopia/lib/ 資料夾中去。
重啟開發板,再看看zbedic 是否可以執行了。還有自己新增字典吧!
下面再把我製作適用於mini2440-qtopia的zbedic和libbedic的補丁也發出來吧,打補丁和編譯的方法如下:
cd libbedic
patch -p1 < ../libbedic.patch
make
cd zbedic
patch -p1 < ../zbedic
make -f Makefile.target
下面附件裡面有我製作zbedic和libbedic的補丁和用於mini2440-ARM的zbedic二進位制程式。