Perguntas frequentes - 6. Problemas de Compilação - Geral
P.6.1: Um script de configuração reclama que não consegue encontrar um "acceptable cc". O que é isso?
R.: Leia a documentação! Para compilar pacotes a partir do código fonte,
você precisa instalar o Xcode que, dentre outros, contém o compilador
C, cc
.
P.6.2: Quando tento executar o comando fink selfupdate-cvs
eu
recebo esta mensagem: "cvs: Command not found." ("cvs: Comando não
encontrado").
R.: Você precisa instalar o Xcode.
P.6.3: Estou recebendo uma mensagem de erro envolvendo o
make
.
R.: Caso sua mensagem seja do formato
make: command not found
(make: comando não encontrado)
ou
Can't exec "make": No such file or directory at /opt/sw/lib/perl5/Fink/Services.pm line 190.
Isso significa que você precisa instalar o Xcode.
Por outro lado, se sua mensagem de erro se parece com
make: illegal option -- C
(make: opção ilegal -- C)
então você substituiu a versão GNU do utilitário make
que veio com o Xcode por uma versão BSD do make. Vários pacotes
dependem de características especiais que são suportadas apenas pelo
GNU make. Assegure-se de que /usr/bin/make
é um link
simbólico para gnumake
e não bsdmake
. Além
disso, assegure-se de que /usr/local/bin
não contenha
outra cópia do make
.
P.6.4: Estou recebendo do comando head uma mensagem estranha. O que está errado?
R.: Caso esteja vendo isto:
Unknown option: 1 Usage: head [-options] <url>...
(Opção desconhecida: 1 Uso: head [-opções] <url>...
seguido por uma lista de descrições de opções, você tem um
executável do head
quebrado. Isto acontece quando você
instala a biblioteca libwww do Perl em um volume de sistema formatado
com HFS+. Ele tenta criar um novo comando /usr/bin/HEAD
que sobrescreve o comando head
já existente porque o
sistema de arquivos não diferencia maiúsculas de minúsculas.
head
é um comando padrão usado em muitos scripts de shell
e Makefiles. Você precisa restaurar o executável original do
head
caso queira usar o Fink.
O script de instalação inicial do Fink a partir do código fonte verifica isso mas ainda assim é possível caso você use a instalação binária na primeira instalação ou instale libwww depois de haver instalado o Fink.
Este problema também já foi relatado devido à instalação de
/opt/sw/bin/HEAD
(mas não por um pacote do Fink). Isto
é fácil de resolver: renomeie /opt/sw/bin/HEAD
.
P.6.5: Quando tento instalar um pacote, recebo uma mensagem de erro sobre tentativa de sobrescrita de um arquivo que está em outro pacote.
R.: Isto acontece ocasionalmente com pacotes múltiplos (isto é, pacotes
que são divididos em -dev, -shlibs etc) quando um arquivo é movido de
um pacote para outro (por exemplo, de foo
para
foo-shlibs
). O que você pode fazer é sobrescrever o
arquivo com aquele do pacote que você esteja tentando instalar (já que
eles são nominalmente o mesmo arquivo):
sudo dpkg -i --force-overwrite nomedoarquivo
onde nomedoarquivo é o arquivo .deb correspondente ao pacote que você esteja tentando instalar.
P.6.6: O que significa "execution of mv failed, exit code 1" quando eu tento compilar um pacote?
R.: Se você tiver o StuffIt Pro instalado, pode ser que voce tenha o modo "Archive via Real Name" ("Arquivar pelo Nome Real") habilitado. Verifique o painel StuffIt na ferramenta Preferências do Sistema e desabilite "ArchiveViaRealName" se estiver habilitado. Ele contém uma reimplementação falha de algumas chamadas de sistema importante que causam erros estranhos e transientes, como esse.
Caso contrário, um erro no mv
geralmente
significa que outro erro anterior ocorreu durante a compilação mas a
compilação não foi interrompiada. Para rastrear os arquivos que
causaram o erro, procure na saída pela compilação de um arquivo que não
exista. Por exemplo, se você tiver algo parecido com:
mv /opt/sw/src/root-foo-0.1.2-3/opt/sw/lib/libbar*.dylib \ /opt/sw/src/root-foo-shlibs-0.1.2-3/opt/sw/lib/ mv: cannot stat `/opt/sw/src/root-foo-0.1.2-3/opt/sw/lib/libbar*.dylib': No such file or directory ### execution of mv failed, exit code 1 Failed: installing foo-0.1.2-3 failed
então você deve procurar por libbar
em algum
lugar mais acima da lista de mensagens que aparecem durante a
tentativa de compilação.
P.6.7: Não consito instalar ou atualizar um pacote porque aparece uma mensagem dizendo que um nó já existe ("node already exists").
R.: Estes erros se parecem com o seguinte:
Failed: Internal error: node for system-xfree86 already exists
O problema é que o mecanismo de dependências está confuso devido a mudanças em alguns dos arquivos de descrição de pacotes. Para corrigi-lo:
-
Force a remoção do pacote causador do problema, por exemplo:
sudo dpkg -r --force-all system-xfree86
para o exemplo listado acima.
-
Tente instalar ou atualizar novamente. Em algum momento uma pergunta envolvendo uma dependência virtual ("virtual dependency") aparecerá incluindo o pacote que você acabou de morever. Selecione o pacote e ele será reinstalado durante sua compilação.
P.6.8: Ouvi dizer que bibliotecas e arquivos de cabeçalho instalados sob /usr/local causam problemas eventuais de compilação no Fink. É verdade?
R.: Este é uma fonte de problemas frequente porque o script de
configuração dos pacotes encontra arquivos de cabeçalho e bibliotecas
em /usr/local
e decide usá-los no lugar daqueles
que residem no diretório do Fink. Se você estiver tendo problemas de
compilação que não são cobertos por outra pergunta deste documento,
você deve verificar se você tem bibliotecas em
/usr/local/lib
ou arquivos de cabeçalho em
/usr/local/include
. Em caso afirmativo, tente
renomear /usr/local
para algum outro nome, por
exemplo
sudo mv /usr/local /usr/local.moved
proceda sua compilação e então volte ao nome original de
/usr/local
:
sudo mv /usr/local.moved /usr/local
Starting with macOS 10.14, it's sometimes not possible to rename /usr/local
. If you get an error when renaming /usr/local
directly, then rename the subdirectories inside it instead:
sudo mv /usr/local/include /usr/local/include.moved sudo mv /usr/local/lib /usr/local/lib.moved
do your build, and then you can put /usr/local/include
and /usr/local/lib
back:
sudo mv /usr/local/include.moved /usr/local/include sudo mv /usr/local/lib.moved /usr/local/lib
P.6.9: Quando tento compilar um pacote, recebo uma mensagem dizendo que um sumário ("table of contents") está desatualizado ("out of date"). O que preciso fazer?
R.: A saída dá uma dica de o que fazer. A mensagem é geralmente parecida com:
ld: table of contents for archive: /opt/sw/lib/libintl.a is out of date; rerun ranlib(1) (can't load from it)
O que você precisa fazer é executar o comando ranlib como root em qualquer biblioteca que esteja causando o problema. Por exemplo, para o caso acima, você executaria:
sudo ranlib /opt/sw/lib/libintl.a
P.6.10: O Fink Commander trava quando tento instalar o pacote atlas.
R.: Isto acontece porque um dos passos durante a compilação do pacote
atlas
faz uma pergunta ao usuário que o Fink Commander não
detecta. Você terá que executar o comando fink install
atlas
no lugar de instalá-lo pelo Fink Commander.
P.6.11: Eu recebo mensagens dizendo que os arquivos
stddef.h
| wchar.h
|
stdlib.h
| crt1.o
estão
faltando ou que meu compilador C não consegue criar executáveis
(C compiler cannot create executables
).
R.: Ambos estes problemas são geralmente devidos à ausência de arquivos
de cabeçalho essenciais que são providos pelo pacote DevSDK do Xcode.
Verifique se /Library/Receipts/DevSDK.pkg
existe
no seu sistema. Em caso negativo, execute novamente o instalador do
Xcode e instale o pacote DevSDK através do Custom Install (instalação
customizada).
O erro cannot create executables
também pode ocorrer
quando sua versão do Xcode é para uma versão anterior do OS.
P.6.12: Não consigo fazer uma atualização porque o Fink não consegue resolver conflito de versão ou dependências múltiplas ("unable to resolve version conflict on multiple dependencies").
R.: Para contornar este problema, tente atualizar um único pacote e
então tente usar novamente o fink update-all
. Se você
ainda receber a mensagem, repita o processo.
P.6.13: Não consigo instalar nada porque recebo a mensagem "dpkg: parse error, in file `/opt/sw/var/lib/dpkg/status'"!
R.: This means that somehow your dpkg database got damaged, usually from a crash or some other unrecoverable error. This most often occurs with a buildlock, e.g:
package `fink-buildlock-foo-1.2.3-4': missing version
(of course, replace foo-1.2.3-4
with the package name you are seeing).
When this happens, you should edit /opt/sw/var/lib/dpkg/status
as a superuser.
Then go near the line number which shows up in the error message.
You should see a fink-buildlock-foo-1.2.3-4
package whose Status
field is marked
install ok installed
Change that to
purge ok not-installed
Under other circumstances, there may be garbage in the file. You can fix this situation by copying the previous version of the database, like so:
sudo cp /opt/sw/var/lib/dpkg/status-old /opt/sw/var/lib/dpkg/status
You may need to re-install the last couple of packages you installed before the problem started occurring.
P.6.14: Estou recebendo erros envolvendo o freetype.
R.: Existem muitas variedades desses erros. Se você receber o seguinte:
/usr/bin/ld: can't locate file for: -lfreetype
verifique se você tem um executável
freetype-config
perdido através do comando
type -a freetype-config
caso esteja usando bash
ou
where freetype-config
caso esteja usando tcsh
. Sabe-se que o
framework Mono instala um /usr/bin/freetype-config
que é um link simbólico para o arquivo que está nesse framework.
Caso seu erro se pareça com o seguinte:
/opt/sw/include/pango-1.0/pango/pangoft2.h:52: error: parse error before '*' token /opt/sw/include/pango-1.0/pango/pangoft2.h:57: error: parse error before '*' token /opt/sw/include/pango-1.0/pango/pangoft2.h:61: error: parse error before '*' token /opt/sw/include/pango-1.0/pango/pangoft2.h:86: error: parse error before "pango_ft2_font_get_face" /opt/sw/include/pango-1.0/pango/pangoft2.h:86: warning: data definition has no type or storage class make[2]: *** [rsvg-gz.lo] Error 1 make[1]: *** [all-recursive] Error 1 make: *** [all-recursive-am] Error 2 ### execution of make failed, exit code 2 Failed: compiling librsvg2-2.4.0-3 failed
ou
In file included from vteft2.c:32: vteglyph.h:64: error: parse error before "FT_Library" vteglyph.h:64: warning: no semicolon at end of struct or union vteft2.c: In function `_vte_ft2_get_text_width': vteft2.c:236: error: dereferencing pointer to incomplete type vteft2.c: In function `_vte_ft2_get_text_height': vteft2.c:244: error: dereferencing pointer to incomplete type vteft2.c: In function `_vte_ft2_get_text_ascent': vteft2.c:252: error: dereferencing pointer to incomplete type vteft2.c: In function `_vte_ft2_draw_text': vteft2.c:294: error: dereferencing pointer to incomplete type vteft2.c:295: error: dereferencing pointer to incomplete type make[2]: *** [vteft2.lo] Error 1 make[1]: *** [all-recursive] Error 1 make: *** [all] Error 2 ### execution of make failed, exit code 2 Failed: compiling vte-0.11.10-3 failed
ou
checking for freetype-config.../usr/X11R6/bin/freetype-config checking For sufficiently new FreeType (at least 2.0.1)... no configure: error: pangoxft Pango backend found but did not find freetype libraries make: *** No targets specified and no makefile found. Stop. ### execution of LD_TWOLEVEL_NAMESPACE=1 failed, exit code 2 Failed: compiling gtk+2-2.2.4-2 failed
o problema é devido a uma confusão entre arquivos cabeçalhos de
pacote freetype
| freetype-hinting
e os
arquivos de cabeçalho do freetype2
que são parte do X11 |
XFree86. O comando
fink remove freetype freetype-hinting
removerá qualquer variante que você haja instalado. Por outro lado, se seu erro é parecido com:
ld: Undefined symbols: _FT_Access_Frame
isto é normalmente devido a um arquivo residual de uma instalação prévia do X11. Reinstale o X11 SDK.
P.6.15: Estou recebendo erros de compilação envolvendo "Dl_info".
R.: Se você tem um erro parecido com
unix_dl.c: In function `rep_open_dl_library': unix_dl.c:328: warning: assignment discards qualifiers from pointer target type unix_dl.c: In function `rep_find_c_symbol': unix_dl.c:466: error: `Dl_info' undeclared (first use in this function) unix_dl.c:466: error: (Each undeclared identifier is reported only once unix_dl.c:466: error: for each function it appears in.) unix_dl.c:466: error: parse error before "info" unix_dl.c:467: error: `info' undeclared (first use in this function) make[1]: *** [unix_dl.lo] Error 1
então o mais provável é que você tenha um arquivo de cabeçalho
/usr/local/include/dlfcn.h
que é incompatível com o
Panther. Tire-o do caminho.
Normalmente, ele é instalado pelo OpenOffice e você deve substituir
esse arquivo de cabeçalho, bem como a biblioteca
/usr/local/lib/libdl.dylib
, por links simbólicos aos
arquivos providos pelo Panther:
sudo ln -s /usr/include/dlfcn.h /usr/local/include/dlfcn.h sudo ln -s /usr/lib/libdl.dylib /usr/local/lib/libdl.dylib
P.6.16: O Fink diz que está faltando gcc2
ou
gcc3.1
mas não consigo instalá-lo.
R.: Isto é porque gcc2
e
gcc3.1
são pacotes virtuais que indicam a presença
de gcc-2.95 e gcc-3.1, respectivamente, em seu sistema. Instale o
pacote gcc2.95 e/ou o gcc.31 do Xcode Tools (versões anteriores do OS
possuem gcc-2.95 e gcc-3.1 como parte da instalação principal do
Developer Tools).
Observação: instalar o gcc2.95 ou gcc3.1 não interferirá com seu compilador gcc3.3--eles podem coexistir.
P.6.17: O Fink apresenta a mensagem Failed: Can't resolve dependency
"system-java14-dev"
mas esse pacote não existe.
R.: É porque é um pacote virtual. Esse tipo de erro acontece quando o Java é atualizado pelo Atualização de Software: os arquivos de cabeçalho são removidos, o que faz com que o pacote -dev não seja gerado.
Você precisa baixar o pacote Java Developer
Tools
apropriado do site da Apple. Neste caso específico, o
pacote é Java 1.4.2 Developer Tools
.
P.6.18: Quando tento instalar qualquer pacote, recebo a mensagem dpkg
(subprocess): failed to exec dpkg-split to see if it's part of a
multiparter: No such file or directory
. Como faço para corrigir
isto?
R.: Isto geralmente pode ser corrigido através da configuração correta do ambiente conforme esta pergunta.
P.6.19: Estou recebendo a seguinte mensagem: configure: error:
XML::Parser perl module is required for intltool
. O que preciso
fazer?
R.: Caso esteja usando a árvore unstable, assegure-se de ter instalado o intltool-0.34.1 ou mais recente.
Caso contrário, você precisa assegurar-se de ter a variante correta
do pacote xml-parser-pm que case com a versão do Perl em seu sistema.
Por exemplo, se você estiver no Panther você deveria ter
xml-parser-pm581
no lugar de xml-parser-pm560
(você também pode ter o substituto xml-parser-pm
), já que
você tem o Perl-5.8.1
no lugar de Perl-5.6.0
Se estiver no Jaguar e estiver usando a versão padrão do Perl para o
sistema, você terá a variante pm560
e se você instalou o
Perl 5.8.0
você pode ter a variante
pm580
.
P.6.20: Estou tentando baixar um pacote mas o Fink vai para um site estranho
com distfiles
no nome e o arquivo não está lá.
R.: O que aconteceu aqui é que o Fink está tentando usar um dos seus
espelhos mestres
. Eles foram configurados para garantir
que códigos fontes dos pacotes do Fink estejam disponíveis mesmo que os
sites oficiais os tenham mudado de lugar. Normalmente esses erros
ocorrem quando uma nova versão oficial de um pacote é lançada mas ainda
não chegou aos espelhos mestres.
Para remediar esta situação, execute o comando fink
configure
e defina a ordem de pesquisa para que use os espelhos
mestres por último.
P.6.21: Quero que o Fink use opções diferentes na compilação de um pacote.
R.: A primeira coisa a fazer é entrar em contato com o mantenedor do pacote para solicitar uma variante. Isto pode ser relativamente fácil de ser feito. Caso você não obtenha resposta do mantenedor ou não veja os pacotes novos, ou queira tentar uma opção diferente por você mesmo, leia o Tutorial de empacotamento e o Manual de empacotamento.
Observação: o Fink é deliberadamente configurado para que todos os binários oficiais sejam idênticos independentemente da máquina em que foram compilados, portanto opções como otimização para o G5 não acontecerão com um pacote oficial. Caso as queira, você terá que fazê-las por sua própria conta.
P.6.22: Sempre que tento compilar a partir do código fonte, o Fink fica reclamando sobre versões alternadas da mesma biblioteca.
R.: É comum que, em uma árvore de compilação complicada, você descubra
que alguns pacotes dependem de uma versão específica de uma biblioteca
e outros dependam em uma versão diferente (por exemplo,
db47
vs. db44
). Consequentemente, o Fink pode
tentar trocar para aquela que não estiver instalada atualmente de forma
a satisfazer a dependência de compilação do pacote que você deseja
atualizar.
Infelizmente, devido a limitações do mecanismo de dependências de compilação, você pode encontrar a famigerada mensagem
Fink::SysState: Could not resolve inconsistent dependencies
ao tentar um update-all
suficientemente complicado.
Esta situação geralmente lhe fornece um comando para tentar resolver o
problema:
fink scanpackages sudo apt-get update sudo apt-get install foo=1.23-4
mas isto pode não funcionar para atualizações suficientemente complicadas. Você talvez precise atualizar pacotes um-a-um, ao menos por algum tempo.
P.6.23: Estou recebendo erros com relação a
MACOSX_DEPLOYMENT_TARGET
quando tento compilar um módulo
Python.
R.: Para erros parecidos com:
running build running build_ext Traceback (most recent call last): File "setup_socket_ssl.py", line 21, in ? depends = ['socketmodule.h'] ) File "/opt/sw/src/root-python24-2.4.1-1/opt/sw/lib/python2.4/distutils/core.py", line 166, in setup SystemExit: error: $MACOSX_DEPLOYMENT_TARGET mismatch: now "10.4" but "10.3" during configure ### execution of /opt/sw/bin/python2.4 failed, exit code 1
o problema ocorre porque os pacotes python2*
gravam o
MACOSX_DEPLOYMENT_TARGET
atual em um arquivo de
configuração quando são compilados e os utilitários de compilação do
python usam esse valor quando compilam módulos. Isto significa que você
tem, por exemplo, um pacote python24
no OS 10.4 que foi
compilado no OS 10.3, ocorrendo tanto na atualização 10.3 => 10.4,
ou através da distribuição binária 10.4-transitional, na qual
o python24
não foi recompilado, havendo portanto uma
diferença entre o que o python acha que
MACOSX_DEPLOYMENT_TARGET
deveria ser (10.3) e o que
realmente é (10.4).
A solução é recompilar o pacote python
que esteja
causando problema, por exemplo fink rebuild python24
para
o caso acima.
Para erros em tempo de execução que exibem o mesmo tipo de mensagem
de erro acima, recompile o módulo após recompilar o pacote
python2*
apropriado.
P.6.24: Eu recebo erros unrecognized option `-dynamic'
da
libtool
.
R.: O erro
libtool: unrecognized option `-dynamic'
normalmente significa que você substituiu a
/usr/bin/libtool
da Apple por uma
libtool
GNU. Infelizmente, as duas
libtools
não funcionam da mesma forma.
A única maneira de resolver este problema é obter uma
libtool
da Apple que funcione. Ela é instalada
como parte do pacote DeveloperTools.pkg
das
ferramentas do Xcode e você pode reinstalar todo o pacote se primeiro
limpar seu arquivo de receita em /Library/Receipts
(arraste-o para a Lixeira).