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. Quandoconfigureinicia, 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 executarmakede 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.cacheshell>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.cccomo 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
gccnecessita de grande quantidade de memória para compilarsql_yacc.cccom funções inline. Tente executandoconfigurecom a opção--with-low-memory:shell>
./configure --with-low-memoryEsta opção adiciona
-fno-inlinena a linha de compilação se você estiver usandogcce-O0se você estiver usando outro programa. Você deve tentar a opção--with-low-memorymesmo 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-memorygeralmente corrige isto. - Por padrão,
configureescolhec++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 usargcccomo seu compilador C++. Tente configurar a variável de ambienteCXXpara'gcc -O3'. Por exemplo:shell>
CXX='gcc -O3' ./configureIsto funciona porque
gcccompila 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
gcccomo 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 GNUgccversã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 ogcccomo o seu compilador C++ definindo a variável de ambienteCXXmencionada 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
makepara 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
makeversã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
CFLAGSeCXXFLAGS. Você pode também especificar os nomes do compilador a ser usado da mesma forma utilizandoCCeCXX. Exemplo:
shell>
CC=gccshell>CFLAGS=-O3shell>CXX=gccshell>CXXFLAGS=-O3shell>export CC CFLAGS CXX CXXFLAGSOlhe 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
gcc2.8.1 funciona, mas recomendamos o uso dogcc2.95.2 ouegcs1.0.3a em seu lugar. - Se você obtem erros como estes vistos abaixo enquanto estiver compilando o
mysqld, oconfigurenã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
XXXparasize_touint, dependendo de seu sistema operacional. (Perceba que você deverá fazer isto cada vez que você executarconfigure, porqueconfigureregeneraconfig.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
mysqldou um cliente MySQL, executeconfigurecom 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
configuretenta 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
gcccomo o seu compilador C++ configurando a variáavel de ambienteCXXparagcc:
export CXX='gcc'
Note que você precisa executar o
configurenovamente após isto. - Certifique-se de que o GNU C++