环境:PC机 ubuntu9.04 交叉编译器:gcc-linaro-arm-linux-gnueabihf-4.7-2013.02-01-20130221_linux,本地gcc: gcc 4.3.3
开发板:OMAP4 cortex-a9 系统:ubuntu12.04
cmake的时候提示我要安装curses库,注意这个库也是要进行交叉编译的,命令如下:
cd /tmp
tar xvf ncurses-5.9.tar.gz
cd ncurses-5.9
./configure --host=arm-linux-gnueabihf --enable-widec --with-shared --prefix=/opt/ncurses --with-build-cc=arm-linux-gnueabihf-gcc --with-build-cc=gcc
make ;
sudo make install
PS: --enable-widec 这个是增加对宽字符的支持的,生成的库都多了一个w,但为了兼容,最后生成后对每个库文件都建一个软连接,把那个w去掉。
如:ln -sv libncursesw.so.5.9 libncurses.so ,要不会提示找不着ncurses这个库
接下来就是对mysql5.5进行编译,命令如下:
cd /tmp
tar xvf mysql-5.5-30.tar.gz
mkdir mysql-5.5-30-build #建一个单独的文件夹来进行编译
cd mysql-5.5-30-build
ccmake ../mysql-5.5-30 #在这里对一些参数进行配置,具体的请参考文件:http://download.csdn.net/detail/dlutxie/5125238
可以把这文件直接拷到mysql-5.5-30-build的目录下然后再运行上面的命令,然后修改里面的一些路径即可。
make
sudo make install
OK,接下来就是在编译过程中可能会遇到的问题如下:
[ 29%] Generating ../include/mysqld_error.h, ../sql/share/english/errmsg.sys..........
/home/xgy/tmp/mysql-5.5.30-bulid/extra/comp_err: 1: Syntax error: word unexpected (expecting ")")
这个可以先看下comp_err这个文件: file ./extra/comp_err 可以看到,这是一个在ARM平台上执行的文件,所以它是不能在x86平台上运行的,后面还有两个错误和这个是同样的原因,分别是comp_sql与gen_lex_hash这两个文件。网上的很多指导是先编译一个x86平台的mysql然后把相应的文件换过来即可,为了这三个文件何必要整个重编译mysql呢,所以我按照那上面的命令,把编译器修改来本机的gcc,g++而不是交叉编译器,所以就得到了x86平台下的文件了,这三个文件可以在这里下载:http://download.csdn.net/detail/dlutxie/5125215
将x86平台下的comp_err拷到 mysql-5.5.30-bulid/extra/目录下,touch extra/comp_err 修改下时间,然后接着执行:make
[ 69%] Building C object libmysql/CMakeFiles/clientlib.dir/__/sql-common/client_plugin.c.o
client_plugin.c.o -c /home/xgy/tmp/mysql-5.5.30/sql-common/client_plugin.c
/home/xgy/tmp/mysql-5.5.30/sql-common/client_plugin.c: In function ‘mysql_client_plugin_init’:
/home/xgy/tmp/mysql-5.5.30/sql-common/client_plugin.c:252:5: error: incompatible type for argument 5 of ‘add_plugin’
/home/xgy/tmp/mysql-5.5.30/sql-common/client_plugin.c:120:1: note: expected ‘va_list’ but argument is of type ‘int’
/home/xgy/tmp/mysql-5.5.30/sql-common/client_plugin.c: In function ‘mysql_client_register_plugin’:
/home/xgy/tmp/mysql-5.5.30/sql-common/client_plugin.c:310:5: error: incompatible type for argument 5 of ‘add_plugin’
/home/xgy/tmp/mysql-5.5.30/sql-common/client_plugin.c:120:1: note: expected ‘va_list’ but argument is of type ‘int’
make[2]: *** [libmysql/CMakeFiles/clientlib.dir/__/sql-cop
这个问题可以参考:http://sophie.zarb.org/distrib/Mageia/1/i586/media/core-updates-src/by-pkgid/3d9c17c564d30ead0a0dab9855d22f9d/files/27
修改sql-common/client_plugin.c文件
第233行左右
int mysql_client_plugin_init()
{
MYSQL mysql;
struct st_mysql_client_plugin **builtin;
va_list dummy; //增加这一行
if (initialized)
第249行左右
add_plugin(&mysql, *builtin, 0, 0, 0); 改为:
add_plugin(&mysql, *builtin, 0, 0,dummy); //也就是把0改为了dummy
第293行左右:
struct st_mysql_client_plugin *
mysql_client_register_plugin(MYSQL *mysql,
struct st_mysql_client_plugin *plugin)
{
va_list dummy; //增加这一行
if (is_not_initialized(mysql, plugin->name))
return NULL;
第307行左右:
plugin= NULL;
}
else
plugin= add_plugin(mysql, plugin, 0, 0,0); //删除这一行
plugin= add_plugin(mysql, plugin, 0, 0, dummy); 增加这一行, 也就是把0改为了dummy
[ 74%] Building CXX object client/CMakeFiles/mysql.dir/sql_string.cc.o
../cmd-line-utils/libedit/libedit.a(terminal.c.o): In function `terminal_deletechars':
/home/xgy/tmp/mysql-5.5.30/cmd-line-utils/libedit/terminal.c:726: undefined reference to `tgoto'
../cmd-line-utils/libedit/libedit.a(terminal.c.o): In function `terminal_set':
/home/xgy/tmp/mysql-5.5.30/cmd-line-utils/libedit/terminal.c:893: undefined reference to `tgetent'
/home/xgy/tmp/mysql-5.5.30/cmd-line-utils/libedit/terminal.c:911: undefined reference to `tgetflag'
解决方法:重新运行 ccmake ../mysql-5.5-30 设置参数 CMAKE_EXE_LINKER_FLAGS = -lncurses 注意是 -l是L的小写,然后接着执行:make
[ 74%] Generating mysql_fix_privilege_tables_sql.c
/home/xgy/tmp/mysql-5.5.30-bulid/scripts/comp_sql: 1: Syntax error: word unexpected (expecting ")")
make[2]: *** [scripts/mysql_fix_privilege_tables_sql.c] Error 2
解决方法:将x86平台上的comp_sql文件拷到./srcipts/目录下(先将原来的comp_sql删掉),然后执行:touch ./srcipts/comp_sql 然后接着执行:make
[ 78%] Generating lex_hash.h
cd /home/xgy/tmp/mysql-5.5.30-bulid/sql && ./gen_lex_hash > lex_hash.h
./gen_lex_hash: 1: Syntax error: word unexpected (expecting ")")
make[2]: *** [sql/lex_hash.h] Error 2
解决方法:将x86平台上的gen_lex_hash文件拷到./sql/目录下(先将原来的gen_lex_hash删掉),然后执行:touch ./sql/gen_lex_hash 然后接着执行:make