top
Loading...
2.8.4.處理MySQL編譯問題
2.8.4. 處理MySQL編譯問題

所有MySQL程序在SolarisLinux上使用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

可以工作,因為gccg++一樣編譯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

已知SolarisFreeBSDmake程序有問題。

已知GNU make 3.75能工作。

·         如果你想要定義CC++編譯器所使用的標志,把標志加到CFLAGSCXXFLAGS環境變量中即可。也可以使用CCCXX來指定編譯器名字。例如:

·                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.2egcs 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
  • 更改XXXsize_tint,取決于你的操作系統。(注意:每次運行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版本不完善的跡象。你可能需要安裝bisonGNUyacc)并使用它。

·         Debian Linux 3.0, 如果你編譯的MySQL 5.1要支持Berkeley DB,需要安裝gawk代替默認的mawk

·         如果你需要調試mysqldMySQL客戶端,運行configure,使用--with-debug選項,然后重新編譯并且將客戶端程序鏈接到新的客戶端庫。請參見E.2節,“調試MySQL客戶端”。

·         如果你在Linux(例如,SuSE Linux 8.1Red 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

作者:mysql.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/installing.html
北斗有巢氏 有巢氏北斗