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

关注编程学问公众号