移植mysql到arm平台


最近需要將一個程序移植到arm平台上,程序調用了MySQL數據庫,所以就牽扯到將MySQL數據庫移植到ARM平台上面,所以在網上大量查閱資料。在baidu文庫發現了一篇文檔,是wlzxlc上傳的文檔名稱為 :《 編譯ARM平台的QtEmbedded的MySQL插件和移植MySQL 下面說明里面介紹到: ARM平台下的QtEmbedded所需mysql插件,及MySQL的移植。 我的整個移植過程參考了這篇文檔,但是遇到了很多的問題,所以又上網搜尋其它資料。現在我已經移植成功,回頭看這篇文檔,就發現里面有很多疏漏甚至是錯誤。這些東西如果不詳細注明出來,更多的新手絕對還會重蹈我的覆轍,所以在這里將 mysql  arm+linux 移植經驗貼出來,希望對新手以及做相關方面工作的人能有幫助。所有在《 編譯ARM平台的QtEmbedded的MySQL插件和移植MySQL 》這篇文檔中的錯誤以及注意事項,我也會一一列出,在下面我將其稱為“原文”。
編譯器:arm-linux-gcc(4.3.2)
  P c平台:ubuntu
       在移植之前有必要先說明一下幾個問題:
1.M y SQL還沒有支持交叉編譯的版本出現.但為了讓編譯繼續 , 必須在 configure 腳本中將多處不支持交叉編譯的命令全都注釋掉,才能讓 configure 順利通過。
  2.交叉編譯過程中需要用到 ncurses-5.6 下的 libncurses.a 庫,而這個庫文件也必須是arm平台下的,所以我們在交叉編譯MySQL時需要先自己手動交叉編譯 libncurses.a 的庫。(原文是說需要libncurses.so.5文件,這里我查閱很多資料發現,應該是 libncurses.a
3.編譯過程中需要運行gen_lex_hash , 但這個命令是 arm 格式的在 pc 機上運行不起來 , 解決方法是要編譯好一個在 pc 上運行的 mysql, 從相應的目錄下拷出gen_lex_hash覆蓋相應目錄下的這個 arm 格式的gen_lex_hash  ( 這里要注意的是這個 pc 機上運行的 mysql 編譯路徑要和現在這個 arm 上運行的 mysql 路徑完全相同 , 否則后面同樣的問題中執行命令時涉及到路徑問題 , 解決辦法是先把現在編譯的arm平台的 mysql 目錄改為其他名稱 , 再解一個 mysql 包改名為 mysql 將其編譯成 pc 上運行的版本 , 只要簡單的用 ./configure |make 就行了 , 再把pc版本的 mysql 改為mysql-pc , 將原來的那個名稱改回 mysql 即可(貌似有點暈乎)。   
 
    下面就是移植過程,原文使用了出錯后講解的思路,我這里就直接寫步驟了,相當於說明書,方便新手操作。
  (1)  准備工作
  ①下載mysql的tar包,我這里用到的是mysql-5.1.51.tai.gz http://www.mirrorservice.org/sites/ftp.mysql.com/Downloads/MySQL-5.1/mysql-5.1.51.tar.gz
②下載ncurses-5.6的tar包
③安裝g++編譯器  root@ubuntu  #  apt-get install g++
④准備編譯前請先確定已安裝交叉編譯器arm-linux-gcc(4.3.2),並已經在終端設置好環境變量,做好這些就可以開始移植工作了。
  (2)  編譯MySQL  PC版本
①先下載壓縮包到本地,並解壓mysql-5.1.51.tar.gz到/opt/lib/mysql-5.1.51: root@ubuntu :/opt/lib#  tar zxvf mysql-5.1.51.tar.gz
  ②進入解壓得到的源碼目錄中
       root@ubuntu :/opt/lib#  cd mysql-5.1.51
   ③運行configure,生成makefile:
       root@ubuntu :/opt/lib/mysql-5.1.51#  ./configure -prefix=/usr/local/mysql 
       如果出現以下提示信息(沒有出錯就不用管):

checking for termcap functions library… configure: error: No curses/ termcap library found

那么就安裝libncurses5-dev進行解決:  root@ubuntu :/opt/lib/mysql-5.1.51#  apt-get install libncurses5-dev
安裝完成之后,再次運行 ./configure –prefix=/usr/local/mysql ,一切正常 .
  ⑤直接開始運行make編譯源代碼:    root@ubuntu :/opt/lib/mysql-5.1.51#  make
M ake完成后,將這個文件夾改名為mysql-5.1.51-pc留作備用。
 
(3)  交叉編譯MySQL -ARM版本
  根據最前面提到的問題,要交叉編譯MySQL -ARM版本,首先我們得先得到一個交叉編譯過的 libncurses.a 的庫,所以為了方便,我們先做這一步。
①交叉編譯ncurses-5.6.tar.gz
i.先下載壓縮包到本地,並解壓ncurses-5.6.tar.gz到/opt/lib/ncurses-5.6: root@ubuntu :/opt/lib#  tar zxvf ncurses-5.6.tar.gz
ii.進入解壓得到的源碼目錄中 root@ubuntu :/opt/lib#  cd ncurses-5.6
 iii.運行configure,生成makefile:(我這里將ncurse安裝到了/usr/local/ncurse)          root@ubuntu :/opt/lib/ncurses-5.6#  ./configure  host=arm-linux -prefix=/usr/local/ncurse  enable-static
v.直接開始運行make編譯源代碼           root@ubuntu :/opt/lib/ncurses-5.6#  make
  iv.直接開始安裝:          root@ubuntu :/opt/lib/ncurses-5.6#  make install
 
安裝完成就可以拿來備用了。原文還牽扯到要備份、還要復制等等,其實完全沒有必要,在編譯MySQL的時候只要指到具體路徑就可以了,根本不需要這么麻煩 …… ..    
  ②重新解壓mysql-5.1.51.tar.gz到/opt/lib/mysql-5.1.51:  root@ubuntu :/opt/lib#  tar zxvf mysql-5.1.51.tar.gz
③進入解壓得到的源碼目錄中:
         root@ubuntu :/opt/lib#  cd mysql-5.1.51   
   ④修改configure,注釋掉不支持交叉編譯的部分     root@ubuntu :/opt/lib#  gedit configure          找到所有如下語句: 
  1. if test "$cross_compiling" = yes; then
  2. { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
  3. $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
  4. { { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5
  5. $as_echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;}
  6. { (exit 1); exit 1; }; }; }
  7. else
修改成
  1. if test "$cross_compiling" = yes; then
  2. echo “skip corss_compiling test”;
  3. #{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
  4. # $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
  5. #{ { $as_echo "$as_me:$LINENO: error: cannot run test program while
  6. # cross compiling See \`config.log' for more details." >&5
  7. #$as_echo "$as_me: error: cannot run test program while cross compiling #See \`config.log' for more details." >&2;}
  8. #{ (exit 1); exit 1; }; }; }
  9. Else
  保存推出  原文那種注釋方法,還需要找到離這段代碼段比較遠的一處#fi,這個本來就容易出問題,而且應該有 將近4段類似代碼 ,而 原文只說明了2段 ,這樣肯定是編譯不過去的。

 

交叉編譯MySQL

有了這些准備工作,這個時候就可以交叉編譯MySQL了。

Ⅰ.配置configure  ./configure --host=arm-linux – -enable-static  --with-named-curses-libs= / usr / local /ncurses/lib/libncurses.a --prefix=/ usr / local /mysql   --without-debug --without-docs --without-man --without-bench --with-charset = gb2312   --with-extra-charsets=ascii,latin1,utf8  這里請注意我標出來的橙色部分,首先是使用 libncurses.a 庫,在交叉編譯MySQL-ARM版本的第一步,交叉編譯 ncurses-5.6 時,我的 ncurse 安裝目錄就是 / usr / local /ncurses/ ,這里前面你要是修改了安裝目錄,這里就需要注意一定要指向你的安裝目錄  第二就是我將交叉編譯的MySQL也安裝到了 / usr / local /mysql ,這個是因為我在編譯PC版本的MySQL時只是使用了make,並沒有make install。如果你也需要使用ubuntu下面的MySQL,並且當時使用了make install,這里就需要注意目錄問題。  Ⅱ.直接開始運行make編譯源代碼: root@ubuntu :/opt/lib/mysql-5.1.51#  make  出現錯誤:

make[2]: Leaving directory `/opt/mysql-5.5.3-m3/sql'

./gen_lex_hash > lex_hash.h-t

/bin/sh: ./gen_lex_hash: cannot execute binary file

這個時候就需要將剛才我們編譯好的PC版本的$MYSQL\sql\目錄下面的gen_lex_hash,然后cp到現在交叉編譯時對應的$MYSQL\sql\目錄覆蓋即可。

這時注意:覆蓋完成后不要急於make,這時輸入如下命令:  root@ubuntu :/opt/lib/mysql-5.1.51#  touch –m sql/gen_lex_hash

然后再執行make

root@ubuntu :/opt/lib/mysql-5.1.51#  make

上面的命令是改變gen_lex_hash的最后修改時間,這樣做的目的是告訴編譯器gen_lex_hash已經是最新的了,不要重新生成它,否則編譯器檢查gen_lex_hash和它的依賴文件的最后修改時間會發現gen_lex_hash比它的依賴文件更舊,就會重新交叉編譯生成它,這樣不管我們做幾次覆蓋的工作錯誤都還會再現.

這個是原文沒有提及的,我在這個問題就耗費了相當長的時間,如果不輸入這條命令,就算你make clean后再make,也一樣還是會出錯,原因就是上面所講的..

出現錯誤:

sql_parse.cc:5432:21: operator '<' has no left operand

解決辦法:

這是由於宏變量STACK_DIRECTION沒有定義初值,網上查找資料發現arm中定義STACK_DIRECTION1,所以找到sql_parse.cc文件,將第5432行的前面一行加入#define STACK_DIRECTION 1

 

Ⅲ.這時就應該能夠正常編譯,編譯結束后就可以執行install    root@ubuntu :/opt/lib/mysql-5.1.51#  make install  至此,編譯arm平台的MySQL基本完成  (4)  編譯mysql插件:

你可以在QT的官方網站下載最新的qt-sdk-linux-x86-opensource-2010.05.1.bin,然后下載執行安裝,我安裝的位置是/opt/。

進入相應的位置找到mysql.pro文件

root@ubuntu : #  cd /opt/qtsdk-2010.05/qt/src/plugins/sqldrivers/mysql

修改mysql.pro文件,添加如下兩行:

    INCLUDEPATH  += /usr/local/mysql/include/mysql

    LIBS         += -L/usr/local/mysql/lib/mysql lmysqlclient_r

 

qmake mysql.pro

make

make install

 

編譯完成,在該路徑下就會生成一個libqsqlmysql.so文件,將該文件復制到/opt/qtsdk-2010.05/qt/plugins/sqldrivers目錄下就可以了  最后同樣感謝原文,也給我提供了很大程度的指導。
注:在找QT在ARM中連接mysql的插件,這是一份比較好的文檔,不過竟然搜不出作者的信息。  只有百度大娘的文庫中有。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM