所有MySQL程序在Solaris或Linux上使用gcc編譯并且沒有任何警告。在其它系統上,由于系統包含文件的差別可能會發生警告。對于使用MIT-pthreads時發生的警告。請參見2.8.5節,“MIT-pthreads注意事項”。其它問題,檢查下面的表。
許多問題的解決方案涉及重新配置。如果你確實需要重新配置,注意下列事項:
- 如果configure在它已經被運行了以后運行,它可以使用先前收集的信息。這個信息存儲在“config.cache”里面。當configure啟動時,它尋找該文件而且如果它存在,假定信息仍然是正確的,讀入它的內容。當你重新配置時,該假設無效。
- 每次運行configure的時候,必須運行make再重新編譯。然而, 你可能想要把先前構造的老的目標文件刪除,因為它們使用不同的配置選項編譯而成。
為了防止使用舊的配置信息或目標文件,重新運行configure前運行這些命令:
shell> rm config.cache
shell> make clean
另外,你可以運行make distclean。
下表描述了一些最常發生的編譯MySQL的問題:
- 如果在編譯“sql_yacc.cc”時,遇到如下錯誤,可能是存儲器或交換空間溢出:
· Internal compiler error: program cc1plus got fatal signal 11
· Out of virtual memory
· Virtual memory exhausted
該問題是gcc要求大量的內存編譯帶有嵌入函數(inline function)的“sql_yacc.cc”。試試以--with-low-memory選項運行configure:
shell> ./configure -- with-low-memory
如果你正在使用gcc,該選項使得將-fno-inline加到編譯行,如果你正使用其它的編譯器,則加入-O0。你應該試一試--with-low-memory選項,即使你有特別多的存儲器和交換空間,而你認為不可能運行得溢出。這個問題甚至會在很慷慨的硬件配置的系統上出現,通常用--with-low-memory選項修正它。
- 默認情況,configure選則c++作為編譯器并用-lg++選項的GNU c++鏈接。如果你正在使用gcc,這個特性在配置期間導致如下問題:
· configure: error: installation or configuration problem:
· C++ compiler cannot create executables.
也可能在編譯期間看到g++、libg++或libstdc++相關的問題。
這些問題的一個原因是你可能沒有g++,或可能有g++但無libg++或libstdc++。看一下“config.log”文件。它應該包含c++編譯器不能工作的準確原因!為了解決這些問題,可以使用gcc作為C++編譯器。試試設置環境變量CXX為"gcc -O3"。例如:
shell> CXX="gcc -O3" ./configure
可以工作,因為gcc象g++一樣編譯C++源碼,但 默認地它不鏈接libg++或libstdc++。
解決這些問題的其它方法當然是安裝g++、libg++和libstdc++。然而,我們建議不要在MySQL中使用libg++或libstdc++,因為只會增加mysqld二進制空間而不會帶來任何好處。部分版本的庫在過去曾經給用戶帶來一些奇怪的問題。
· 如果你的編譯以下面任何錯誤而失敗,必須升級make版本到GNUmake:
· making all in mit-pthreads
· make: Fatal error in reader: Makefile, line 18:
· Badly formed macro assignment
或:
make: file `Makefile' line 18: Must be a separator (:
或:
pthread.h: No such file or directory
已知Solaris和FreeBSD的make程序有問題。
已知GNU make 3.75能工作。
· 如果你想要定義C或C++編譯器所使用的標志,把標志加到CFLAGS和CXXFLAGS環境變量中即可。也可以使用CC和CXX來指定編譯器名字。例如:
· shell> CC=gcc
· shell> CFLAGS=-O3
· shell> CXX=gcc
· shell> CXXFLAGS=-O3
· shell> export CC CFLAGS CXX CXXFLAGS
對于已經知道在不同系統上有用的標志定義列表,參見2.1.2.5節,“MySQL AB編譯的MySQL二進制版本”。
· 如果你遇到象如下的一條錯誤消息,則需要升級gcc編譯器:
· client/libmysql.c:273: parse error before `__attribute__'
gcc2.8.1已知可以工作,但是我們推薦使用gcc 2.95.2或egcs 1.0.3a。
· 如果編譯mysqld時顯示例如下面的那些錯誤, configure沒有正確地檢測傳到accept()、getsockname()或getpeername()最后參數的類型:
· cxx: Error: mysqld.cc, line 645: In this statement, the referenced
· type of the pointer value ''length'' is ''unsigned long'',
· which is not compatible with ''int''.
· new_sock = accept(sock, (struct sockaddr *)&cAddr, &length);
為了修正它,編輯“config.h”文件(它由configure生成)。尋找這些行:
/* Define as the base type of the last arg to accept */
#define SOCKET_SIZE_TYPE XXX
- 更改XXX為size_t或int,取決于你的操作系統。(注意:每次運行configure都必須這樣做,因為configure重新生成“config.h”)。
- “sql_yacc.cc”文件由“sql_yacc.yy”生成。通常構造過程不需要創造“sql_yacc.cc”,因為MySQL有一個已經生成的拷貝,然而,如果你確實需要再創建它,可能會碰到這個錯誤:
· "sql_yacc.yy", line xxx fatal: default action causes potential...
這是一個yacc版本不完善的跡象。你可能需要安裝bison(GNU的yacc)并使用它。
· 在Debian Linux 3.0上, 如果你編譯的MySQL 5.1要支持Berkeley DB,需要安裝gawk代替默認的mawk。
· 如果你需要調試mysqld或MySQL客戶端,運行configure,使用--with-debug選項,然后重新編譯并且將客戶端程序鏈接到新的客戶端庫。請參見E.2節,“調試MySQL客戶端”。
· 如果你在Linux(例如,SuSE Linux 8.1或Red Hat Linux 7.3)下遇到類似下面的編譯錯誤:
· libmysql.c:1329: warning: passing arg 5 of `gethostbyname_r' from
· incompatible pointer type
· libmysql.c:1329: too few arguments to function `gethostbyname_r'
· libmysql.c:1329: warning: assignment makes pointer from integer
· without a cast
· make[2]: *** [libmysql.lo] Error 1
默認情況,configure腳本試圖使用g++ GNU C++編譯器來確定正確的參數。如果未安裝g++,將會產生錯誤的結果。有兩種方法可以解決該問題:
o 確保安裝了GNU C++ g++。在某些Linux分發版上,需要安裝的軟件包叫做gpp;在其它分發版上名為gcc-c++。
o 使用gcc作為C++ 編譯器,將CXX環境變量設置為gcc:
o export CXX="gcc"
請注意之后需要再次運行configure。