Cygwin下編譯MySQL源碼遇到的問題解決方法

轉自:http://www.cnblogs.com/northhurricane/p/3665120.html

一、安裝環境

操作系統:window8.1

cygwin:x86_64

mysql:Generic Linux (Architecture Independent) 5.6.17

二、cmake編譯命令

cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DSYSCONFDIR=/etc \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=0 \
-DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci

三、編譯時問題

錯誤1
In file included from /cygdrive/d/openSource/mysql/mysql-5.6.17.tar/mysql-5.6.17/cmd-line-utils/libedit/readline.c:54:0:
/cygdrive/d/openSource/mysql/mysql-5.6.17.tar/mysql-5.6.17/cmd-line-utils/libedit/editline/readline.h:79:29: 致命錯誤:sys/ttydefaults.h:No such file or directory
#include <sys/ttydefaults.h>

解決方法
在readline.h中
#if !defined(__sun) && !defined(__hpux) && !defined(_AIX) && !defined(__QNXNTO__) && !defined(__USLC__) 
修改爲
#if !defined(__sun) && !defined(__hpux) && !defined(_AIX) && !defined(__QNXNTO__) && !defined(__USLC__) && !defined(__CYGWIN__)
參考
http://blog.csdn.net/zhukanjie/article/details/6129389
http://www.cygwin.com/ml/cygwin/2010-01/msg01124.html

 

錯誤2
/cygdrive/d/openSource/mysql/mysql-5.6.17.tar/mysql-5.6.17/cmd-line-utils/libedit/vi.c:921:19: 錯誤:expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘char’
__weakref_visible char *my_get_alias_text(const char *)
^
/cygdrive/d/openSource/mysql/mysql-5.6.17.tar/mysql-5.6.17/cmd-line-utils/libedit/vi.c:922:36: 錯誤:宏“__weak_reference”需要 2 個參數,但只給出了 1 個
__weak_reference(get_alias_text);
^
/cygdrive/d/openSource/mysql/mysql-5.6.17.tar/mysql-5.6.17/cmd-line-utils/libedit/vi.c: 在函數‘vi_alias’中:
/cygdrive/d/openSource/mysql/mysql-5.6.17.tar/mysql-5.6.17/cmd-line-utils/libedit/vi.c:933:6: 錯誤:‘my_get_alias_text’未聲明(在此函數內第一次使用)

解決方法
文件:vi.c
在代碼“#if defined(__weak_reference) && !defined(__FreeBSD__)” 前增加
#ifdef __CYGWIN__
#undef __weak_reference
#endif

錯誤3
/cygdrive/e/opensource/mysql/mysql-5.6.17.tar/mysql-5.6.17/strings/dtoa.c:55:14: 錯誤:與‘dtoa’類型衝突
static char *dtoa(double, int, int, int *, int *, char **, char *, size_t);
^
In file included from /usr/include/sys/types.h:20:0,
from /usr/include/pthread.h:14,
from /cygdrive/e/opensource/mysql/mysql-5.6.17.tar/mysql-5.6.17/include/my_global.h:266,
from /cygdrive/e/opensource/mysql/mysql-5.6.17.tar/mysql-5.6.17/include/my_base.h:24,
from /cygdrive/e/opensource/mysql/mysql-5.6.17.tar/mysql-5.6.17/strings/dtoa.c:39:
/usr/include/stdlib.h:169:8: 附註:‘dtoa’的上一個聲明在此
char * _EXFUN(dtoa,(double, int, int, int *, int*, char**));
^
strings/CMakeFiles/strings.dir/build.make:586: recipe for target 'strings/CMakeFiles/strings.dir/dtoa.c.o' failed

解決方法

dtoa.c中將dtoa替換爲_dtoa

錯誤4

In file included from /cygdrive/e/opensource/mysql/mysql-5.6.17.tar/mysql-5.6.17/storage/innobase/handler/ha_innodb.cc:47:0:
/cygdrive/e/opensource/mysql/mysql-5.6.17.tar/mysql-5.6.17/storage/innobase/include/fts0priv.ic: 在函數‘ulint fts_read_object_id(ib_id_t*, const char*)’中:
/cygdrive/e/opensource/mysql/mysql-5.6.17.tar/mysql-5.6.17/storage/innobase/include/univ.i:453:26: 錯誤:expected ‘)’ before ‘PRIx64’
# define UINT64PFx "%016"PRIx64
^
/cygdrive/e/opensource/mysql/mysql-5.6.17.tar/mysql-5.6.17/storage/innobase/include/fts0priv.ic:69:21: 附註:in expansion of macro ‘UINT64PFx’
return(sscanf(str, UINT64PFx, id) == 1);
^

解決方法

修改文件univ.i

# define UINT32PF "%"PRIu32
# define INT64PF "%"PRId64
# define UINT64PF "%"PRIu64
# define UINT64PFx "%016"PRIx64
# define DBUG_LSN_PF UINT64PF

修改爲

#if defined (__CYGWIN__)
# define UINT32PF "%""u"
# define INT64PF "%""l""d"
# define UINT64PF "%""l""u"
# define UINT64PFx "%016d""l""x"
# define DBUG_LSN_PF UINT64PF
#else
# define UINT32PF "%"PRIu32
# define INT64PF "%"PRId64
# define UINT64PF "%"PRIu64
# define UINT64PFx "%016"PRIx64
# define DBUG_LSN_PF UINT64PF
#endif /*__INSIDE_CYGWIN__*/

原因

在cygwin環境下,g++使用的inttypes.h在目錄/usr/lib/gcc/x86_64-pc-cygwin/4.8.2/include中

該文件中沒有UINT32PF的定義,所以會導致編譯錯誤

安裝問題

運行 make install會碰到如下問題

-- Installing: /usr/local/mysql/./README
CMake Error at cmake_install.cmake:42 (FILE):
file INSTALL cannot set permissions on "/usr/local/mysql/./README"

解決方法

chmod 777 -R *

修改所有的文件屬性

原因

目錄下的文件不具備讀寫等屬性

參考

1、用於在編譯中進行調試的gcc/g++命令

http://www.lingcc.com/2011/06/27/11679/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章