Lidando com Problemas de Compilação
Todos programas MariaDB compilam de forma limpa sem alertas no solaris usando gcc
. Em outros sistemas, alertas podem ocorrer devido a diferenças em arquivos include dos sistemas. Veja "Notas MIT-pthreads" para avisos que podem ocorrer usando MIT-pthreads. Para outros problemas, confira a lista abaixo.
A solução para vários problemas envolve reconfiguração. Se você precisa reconfigurar, faça notas do seguinte:
- Se
configure
é executado depois dele já ter sido chamado, ele pode usar informação que foi colhida durante a chamada anterior. Esta informação é armazenada no arquivoconfig.cache
. Quandoconfigure
inicia, ele procura por este arquivo, lê seu conteúdo, se ele existir, assumindo que aquela informação continua correta. Essa conjetura é inválida quando você reconfigurar.
- Cada vez que você executa
configure
, você deve executarmake
de novo para recompilar. Entretanto, você pode desejar remover primeiro antigos arquivos objeto de construções anteriores, porque eles foram compilados usando diferentes opções de configuração.
Para prevenir antigas informações de configurações ou arquivos objetos de serem usados, execute estes comandos antes de re-executar configure
:
shell>rm config.cache
shell>make clean
Uma alternativa, seria executar make distclean
A lista abaixo descreve alguns dos problemas compilando o MariaDB que tem sido encontrados com mais frequencia:
- Se você obtêm erros quando
sql_yacc.cc
como os mostrados abaixo, você provavelmente tem de falta de memória ou espaço de swap:Internal compiler error: program cc1plus got fatal signal 11 ou Out of virtual memory ou Virtual memory exhausted
O problema é que
gcc
necessita de grande quantidade de memória para compilarsql_yacc.cc
com funções inline. Tente executandoconfigure
com a opção--with-low-memory
:shell>
./configure --with-low-memory
Esta opção adiciona
-fno-inline
na a linha de compilação se você estiver usandogcc
e-O0
se você estiver usando outro programa. Você deve tentar a opção--with-low-memory
mesmo se você tiver muita memória e espaço de swap que você ache ser suficieente para não ocorrer erros. Este problema tem ocorrido mesmo em sistemas com boas configurações de hardware e a opção--with-low-memory
geralmente corrige isto. - Por padrão,
configure
escolhec++
como o nome do compilador e GNUc++
liga com-lg++
. Se você estiver usandogcc
, este comportamento pode causar problemas durante a compilação, como o seguinte:configure: error: installation or configuration problem: C++ compiler cannot create executables.
Você podem também ter problemas durante a compilação relacionados à
g++
,libg++
oulibstdc++
.Uma causa destes problemas é que você pode não ter
g++
ou você pode terg++
mas não ter olibg++
ou olibstdc++
. De uma olhada no arquivoconfig.log
. Ele deve conter a razão exata do porque seu compilador C++ não funciona! Para trabalhar evitando estes problemas, você pode usargcc
como seu compilador C++. Tente configurar a variável de ambienteCXX
para'gcc -O3'
. Por exemplo:shell>
CXX='gcc -O3' ./configure
Isto funciona porque
gcc
compila código fonte C++ tão bem quantog++
faz, mas não ifaz a ligação emlibg++
oulibstdc++
por padrão.Outra forma de corrigir estes problemas, com certeza, é instalando
g++
,libg++
elibstdc++
. No entanto gostariamos de lhe recomendar a não usarlibg++
oulibstdc++
com o MariaDB já que isto irá aumentar o tamanho do binário do mysqld sem lhe trazer nenhum benefício. Algumas versões destas bibliotecas também tem causado problemas estranhos para os usuários MariaDB no passado.Usar
gcc
como compilador C++ também é exigido, se você quiser compilar o MariaDB com a funcionalidade RAID (veja "SintaxeCREATE TABLE
" para mais informações sobre tipos de tabela RAID) e você estiver usando o GNUgcc
versão 3 e acima. Se você obter erros como estes abaixo durante o estágio de ligação quando você configurar o MariaDB para compilar com a opção--with-raid
, tente usar ogcc
como o seu compilador C++ definindo a variável de ambienteCXX
mencionada acima: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
- Se sua compilação falhar com erros, como um dos seguintes, você deve atualizar sua versão de
make
para GNUmake
:making all in mit-pthreads make: Fatal error in reader: Makefile, line 18: Badly formed macro assignment or make: file `Makefile' line 18: Must be a separator (: or pthread.h: No such file or directory
O Solaris e o FreeBSD são conhecidos por terem alguns problemas com o
make
.O GNU
make
versão 3.75 irá funcionar. - Se você deseja definir algumas opções que devem ser usadas pelo seu compilador C ou C++, adicione as opções para as variáveis de ambiente
CFLAGS
eCXXFLAGS
. Você pode também especificar os nomes do compilador a ser usado da mesma forma utilizandoCC
eCXX
. Exemplo:
shell>
CC=gcc
shell>CFLAGS=-O3
shell>CXX=gcc
shell>CXXFLAGS=-O3
shell>export CC CFLAGS CXX CXXFLAGS
Olhe em "Binários MariaDB compilados pela MariaDB Foundation" para uma lista de definição de opções que tenham sido úteis em vários sistemas.
- Se você recebeu uma mensagem de erro como esta, é necessário atualizar o compilador
gcc
:
O
gcc
2.8.1 funciona, mas recomendamos o uso dogcc
2.95.2 ouegcs
1.0.3a em seu lugar. - Se você obtem erros como estes vistos abaixo enquanto estiver compilando o
mysqld
, oconfigure
não detectou corretamente o tipo do último argumento paraaccept()
,getsockname()
ougetpeername()
:
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);
Para corrigir isto, edite o arquivo
config.h
(que é gerado peloconfigure
). Procure por estas linhas:/* Define as the base type of the last arg to accept */ #define SOCKET_SIZE_TYPE XXX
Altere
XXX
parasize_t
ouint
, dependendo de seu sistema operacional. (Perceba que você deverá fazer isto cada vez que você executarconfigure
, porqueconfigure
regeneraconfig.h
.) - O arquivo
sql_yacc.cc
é gerado pelosql_yacc.yy
. Normalmente o processo de construção não necessita criarsql_yacc.cc
, porque o MariaDB já vem com uma cópia pré-gerada. Entretanto, se você necessita recriá-lo você pode encontrar este erro:
'sql_yacc.yy', line xxx fatal: default action causes potential...
Isto é um indício de que sua versão do
yacc
é deficiente. Provavelmente você precisará instalar obison
(a versão GNU deyacc
) e usá-lo no lugar doyacc
. - Se você necessita depurar
mysqld
ou um cliente MySQL, executeconfigure
com a opção--with-debug
, então recompile e ligue seus clientes com a nova biblioteca cliente. Leia Seção E.2, "Depurando um cliente MySQL.".
- Se você tem um erro de compilação no Linux (ex. SuSE Linux 8.1 ou Red Hat Linux 7.3) parecido com o seguinte:
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
Por padrão, o script
configure
tenta determinar o número correto de argumentos usando o compilador GNU C++g++
. Ele testa os resultados errados permitidos, se og++
não está instalado. Existem dois modos de contornar este problema:- Certifique-se de que o GNU C++
g++
está instalado. Em algumas distribuições Linux, o pacote exigido é chamadogpp
, em outro ele é chamadogcc-c++
.
- Use o
gcc
como o seu compilador C++ configurando a variáavel de ambienteCXX
paragcc
:
export CXX='gcc'
Note que você precisa executar o
configure
novamente após isto. - Certifique-se de que o GNU C++