• Nenhum resultado encontrado

Lidando com Problemas de Compila¸c˜ ao

No documento 1 Informa¸c˜ oes Gerais . . . . 1 (páginas 137-140)

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.

No documento 1 Informa¸c˜ oes Gerais . . . . 1 (páginas 137-140)