すべての MySQL プログラムは、gcc
を使用して、Solaris または Linux
上で警告を受け取ることなくきれいにコンパイルできます。他のシステム上では、システムインクルードファイルの違いが原因で警告が発生することがあります。MIT-pthreads
を使用している場合に発生する可能性のある警告については、項2.3.6. 「MIT-pthreads に関する注意事項」
を参照してください。それ以外の問題については、以下の一覧をチェックしてください。
多くの問題は、解決に再 configure が必要です。再 configure が必要な場合は、以下の点に留意してください。
configure
を 1
度実行した後にもう 1
度実行すると、前回の起動時に収集した情報を使用することがある。この情報は、config.cache
に格納されている。configure
は、起動時にこのファイルを探し、ファイルが存在する場合は、その情報が現在も適切であるものと想定してファイルの内容を読み取る。再
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
がインライン関数を備えた
sql_yacc.cc
をコンパイルするために大量のメモリを必要とすることである。--with-low-memory
オプションを指定して configure
を実行する。
shell> ./configure --with-low-memory
このオプションによって、gcc
を使用している場合は
-fno-inline
、それ以外のコンパイラを使用している場合は
-O0
がコンパイル行に追加される。メモリとスワップ領域が十分にあり、不足することはないと思われる場合でも、--with-low-memory
オプションを試してみる。この問題は、メモリの豊富なハードウェア構成のシステム上でも発生することがわかっており、通常は
--with-low-memory
オプションを指定することで修正される。
デフォルトでは、configure
はコンパイラ名として c++
を選び、GNU c++
は
-lg++
をリンクする。gcc
を使用している場合は、その動作によってコンフィギャ時に以下のような問題が発生することがある。
configure: error: installation or configuration problem: C++ compiler cannot create executables.
g++
、libg++
、または
libstdc++
に関連したコンパイル時の問題が発生することもある。
これらの問題の原因の 1
つは、g++
がないか、g++
があっても
libg++
または
libstdc++
がないことである。config.log
ファイルを調べると、このファイルに、C++
コンパイラが機能しない正確な理由が記述されているはずである。これらの問題に対処するために、C++
コンパイラとして gcc
を使用することができる。環境変数
CXX
を "gcc -O3"
にする。たとえば、以下のように指定する。
shell> CXX="gcc -O3" ./configure
gcc
は、g++
と同様に C++
ソースをコンパイルするが、デフォルトでは
libg++
または
libstdc++
にはリンクしない。
当然ながら、これらの問題を修正するもう 1
つの方法は、g++
、libg++
、および
libstdc++
をインストールすることである。しかし、libg++
または libstdc++
を MySQL
と共に使用することはお勧めしない。mysqld
のバイナリサイズを増やすだけで何の利点もないためである。
これらのライブラリのバージョンの中には、MySQL
ユーザにとって未知の問題を過去に引き起こしたものもある。
GNU gcc
バージョン 3
以降を使用しており、RAID 機能(RAID
テーブル型の詳細については
項6.5.3. 「CREATE TABLE
構文」
を参照)を組み込んだ MySQL
をコンパイルする場合も、C++
コンパイラとして gcc
を使用する必要がある。--with-raid
オプションを使用してコンパイルするように
MySQL
をコンフィギャしているときに、リンク段階で以下のいずれかのようなエラーが発生した場合は、前述の環境変数
CXX
を定義して C++
コンパイラとして gcc
を使用してみる。
gcc -O3 -DDBUG_OFF -rdynamic -o isamchk isamchk.o sort.o libnisam.a ../mysys/libmysys.a ../dbug/libdbug.a ../strings/libmystrings.a -lpthread -lz -lcrypt -lnsl -lm -lpthread ../mysys/libmysys.a(raid.o)(.text+0x79): In function `my_raid_create': : undefined reference to `operator new(unsigned)' ../mysys/libmysys.a(raid.o)(.text+0xdd): In function `my_raid_create': : undefined reference to `operator delete(void*)' ../mysys/libmysys.a(raid.o)(.text+0x129): In function `my_raid_open': : undefined reference to `operator new(unsigned)' ../mysys/libmysys.a(raid.o)(.text+0x189): In function `my_raid_open': : undefined reference to `operator delete(void*)' ../mysys/libmysys.a(raid.o)(.text+0x64b): In function `my_raid_close': : undefined reference to `operator delete(void*)' collect2: ld returned 1 exit status
以下のいずれかのようなエラーでコンパイルが失敗した場合は、make
のバージョンを GNU make
にアップグレードする必要がある。
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.2.8. 「MySQL AB がコンパイルした MySQL バイナリ」 を参照。
以下のようなエラーメッセージが出力された場合は、gcc
コンパイラをアップグレードする必要がある。
client/libmysql.c:273: parse error before `__attribute__'
gcc
2.8.1
は正しく機能することが知られているが、当社では
gcc
2.95.X の使用をお勧めする。
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
は
config.h
を生成するので、configure
を実行するたびにこの処理を行う必要がある)。
sql_yacc.cc
ファイルは、sql_yacc.yy
から生成される。MySQL
には生成済みのコピーが付属しているので、通常はビルドプロセスが
sql_yacc.cc
を作成する必要はない。ただし、このファイルを再作成する必要がある場合は、以下のエラーが出力される。
"sql_yacc.yy", line xxx fatal: default action causes potential...
このエラーは、使用している
yacc
のバージョンでは不十分であることを示している。
ほとんどの場合、bison
(GNU
バージョンの
yacc
)をインストールして、現在の
yacc の代わりに使用する必要がある。
mysqld
または MySQL
クライアントをデバッグする必要がある場合は、--with-debug
オプションを指定して configure
を実行する。次に、再コンパイルして、クライアントを新しいクライアントライブラリにリンクする。
See 項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
スクリプトは、デフォルトで GNU C++
コンパイラである g++
を使用して引数の正しい数を判別しようとする。しかし、g++
がインストールされていないと、このテストで正しくない結果が返される。この問題に対処するには、以下の
2 つの方法がある。
GNU C++ g++
がインストールされていることを確認する。必要なパッケージの名前は、Linux
ディストリビューションの種類に応じて
gpp
または
gcc-c++
である。
CXX
環境変数を
gcc
に設定して、C++
コンパイラとして gcc
を使用する。
export CXX="gcc"
注意: 後で configure
を再実行する必要があります。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.