Verificando Assinatura Usando RPM
2.3 Instalando uma distribui¸c˜ ao com fontes do MySQL
2.3.5 Lidando com Problemas de Compila¸c˜ ao
Todos programas MySQL compilam de forma limpa sem alertas no solaris usando gcc.
Em outros sistemas, alertas podem ocorrer devido a diferen¸cas em arquivos include dos sistemas. Veja Se¸c˜ao 2.3.6 [MIT-pthreads], P´agina 106 para avisos que podem ocorrer usando MIT-pthreads. Para outros problemas, confira a lista abaixo.
A solu¸c˜ao para v´arios problemas envolve reconfigura¸c˜ao. Se vocˆe precisa reconfigurar, fa¸ca notas do seguinte:
• Se configure ´e executado depois dele j´a ter sido chamado, ele pode usar informa¸c˜ao que foi colhida durante a chamada anterior. Esta informa¸c˜ao ´e armazenada no ar-quivo ‘config.cache’. Quando configure inicia, ele procura por este arquivo, lˆe seu conte´udo, se ele existir, assumindo que aquela informa¸c˜ao continua correta. Essa con-jetura ´e inv´alida quando vocˆe reconfigurar.
• Cada vez que vocˆe executa configure, vocˆe deve executar make de novo para re-compilar. Entretanto, vocˆe pode desejar remover primeiro antigos arquivos objeto de constru¸c˜oes anteriores, porque eles foram compilados usando diferentes op¸c˜oes de con-figura¸c˜ao.
Para prevenir antigas informa¸c˜oes de configura¸c˜oes 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 MySQL que tem sido encontra-dos com mais frequencia:
• Se vocˆe obtˆem erros quando ‘sql_yacc.cc’ como os mostrados abaixo, vocˆe provavel-mente tem de falta de mem´oria ou espa¸co de swap:
Internal compiler error: program cc1plus got fatal signal 11 ou
Out of virtual memory ou
Virtual memory exhausted
O problema ´e que gcc necessita de grande quantidade de mem´oria para compilar
‘sql_yacc.cc’ com fun¸c˜oes inline. Tente executandoconfigurecom a op¸c˜ao --with-low-memory:
shell> ./configure --with-low-memory
Esta op¸c˜ao adiciona -fno-inline na a linha de compila¸c˜ao se vocˆe estiver usando gcc e -O0 se vocˆe estiver usando outro programa. Vocˆe deve tentar a op¸c˜ao --with-low-memory mesmo se vocˆe tiver muita mem´oria e espa¸co de swap que vocˆe ache ser suficieente para n˜ao ocorrer erros. Este problema tem ocorrido mesmo em sistemas
com boas configura¸c˜oes de hardware e a op¸c˜ao--with-low-memorygeralmente corrige isto.
• Por padr˜ao,configureescolhec++como o nome do compilador e GNUc++liga com -lg++. Se vocˆe estiver usandogcc, este comportamento pode causar problemas durante a compila¸c˜ao, como o seguinte:
configure: error: installation or configuration problem:
C++ compiler cannot create executables.
Vocˆe podem tamb´em ter problemas durante a compila¸c˜ao relacionados `a g++,libg++
ou libstdc++.
Uma causa destes problemas ´e que vocˆe pode n˜ao terg++ou vocˆe pode terg++mas n˜ao ter olibg++ou olibstdc++. De uma olhada no arquivo ‘config.log’. Ele deve conter a raz˜ao exata do porque seu compilador C++ n˜ao funciona! Para trabalhar evitando estes problemas, vocˆe pode usar gcc como seu compilador C++. Tente configurar a vari´avel de ambiente CXXpara"gcc -O3". Por exemplo:
shell> CXX="gcc -O3" ./configure
Isto funciona porque gcc compila c´odigo fonte C++ t˜ao bem quanto g++ faz, mas n˜ao ifaz a liga¸c˜ao emlibg++ou libstdc++ por padr˜ao.
Outra forma de corrigir estes problemas, com certeza, ´e instalando g++, libg++
e libstdc++. No entanto gostariamos de lhe recomendar a n˜ao usar libg++ ou libstdc++ com o MySQL j´a que isto ir´a aumentar o tamanho do bin´ario do mysqld sem lhe trazer nenhum benef´icio. Algumas vers˜oes destas bibliotecas tamb´em tem causado problemas estranhos para os usu´arios MySQL no passado.
Usar gcccomo compilador C++ tamb´em ´e exigido, se vocˆe quiser compilar o MySQL com a funcionalidade RAID (veja Se¸c˜ao 6.5.3 [CREATE TABLE], P´agina 597 para mais informa¸c˜oes sobre tipos de tabela RAID) e vocˆe estiver usando o GNUgccvers˜ao 3 e acima. Se vocˆe obter erros como estes abaixo durante o est´agio de liga¸c˜ao quando vocˆe configurar o MySQL para compilar com a op¸c˜ao --with-raid, tente usar ogcc como o seu compilador C++ definindo a vari´avel 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¸c˜ao falhar com erros, como um dos seguintes, vocˆe deve atualizar sua vers˜ao demake 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˜ao conhecidos por terem alguns problemas com omake.
O GNUmake vers˜ao 3.75 ir´a funcionar.
• Se vocˆe deseja definir algumas op¸c˜oes que devem ser usadas pelo seu compilador C ou C++, adicione as op¸c˜oes para as vari´aveis de ambienteCFLAGS eCXXFLAGS. Vocˆe pode tamb´em especificar os nomes do compilador a ser usado da mesma forma utilizandoCC e CXX. Exemplo:
shell> CC=gcc shell> CFLAGS=-O3 shell> CXX=gcc shell> CXXFLAGS=-O3
shell> export CC CFLAGS CXX CXXFLAGS
Olhe em Se¸c˜ao 2.2.8 [MySQL binaries], P´agina 86 para uma lista de defini¸c˜ao de op¸c˜oes que tenham sido ´uteis em v´arios sistemas.
• Se vocˆe recebeu uma mensagem de erro como esta, ´e necess´ario atualizar o compilador gcc:
O gcc 2.8.1 funciona, mas recomendamos o uso do gcc 2.95.2 ou egcs 1.0.3a em seu lugar.
• Se vocˆe obtem erros como estes vistos abaixo enquanto estiver compilando o mysqld, o configure n˜ao detectou corretamente o tipo do ´ultimo argumento para accept(), 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 ´e gerado peloconfigure). Procure por estas linhas:
/* Define as the base type of the last arg to accept */
#define SOCKET_SIZE_TYPE XXX
Altere XXX para size_t ou int, dependendo de seu sistema operacional. (Perceba que vocˆe dever´a fazer isto cada vez que vocˆe executar configure, porque configure regenera ‘config.h’.)
• O arquivo ‘sql_yacc.cc’ ´e gerado pelo ‘sql_yacc.yy’. Normalmente o processo de constru¸c˜ao n˜ao necessita criar ‘sql_yacc.cc’, porque o MySQL j´a vem com uma c´opia pr´e-gerada. Entretanto, se vocˆe necessita recri´a-lo vocˆe pode encontrar este erro:
"sql_yacc.yy", line xxx fatal: default action causes potential...
Isto ´e um ind´icio de que sua vers˜ao do yacc´e deficiente. Provavelmente vocˆe precisar´a instalar o bison (a vers˜ao GNU deyacc) e us´a-lo no lugar doyacc.
• Se vocˆe necessita depurar mysqld ou um cliente MySQL, execute configure com a op¸c˜ao--with-debug, ent˜ao recompile e ligue seus clientes com a nova biblioteca cliente.
Veja Se¸c˜ao D.2 [Debugging client], P´agina 1076.
• Se vocˆe tem um erro de compila¸c˜ao 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˜ao, o script configure tenta determinar o n´umero correto de argumentos usando o compilador GNU C++ g++. Ele testa os resultados errados permitidos, se o g++ n˜ao est´a instalado. Existem dois modos de contornar este problema:
• Certifique-se de que o GNU C++ g++ est´a instalado. Em algumas distribui¸c˜oes Linux, o pacote exigido ´e chamadogpp, em outro ele ´e chamadogcc-c++.
• Use o gcc como o seu compilador C++ configurando a vari´aavel de ambienteCXX paragcc:
export CXX="gcc"
Note que vocˆe precisa executar oconfigure novamente ap´os isto.