quinta-feira, 20 de outubro de 2011

Lazarus crosscompiler Linux -> Windows (can't find unit system)

Ao tentar compilar um programa para a plataforma Windows você recebe a mensagem abaixo?

Can't find unit system used by...


Continua com o problema mesmo depois de ter seguido a dica abaixo?


Compilando um programa para windows no Linux

O problema ocorre porque no Free Pascal Compiler deve existir uma versão de cada unit compilada para cada sistema operacional de destino que será utilizado, no meu caso até existe mas na versão do FPC diferente da que eu uso no Linux e por isso no momento da compilação o Lazarus acaba buscando no path errado essas units, a única forma que eu consegui contornar o problema sem muito esforço foi alterando o path diretamente no arquivo de configurações do FPC, mas faço isso apenas no caso do Windows. Veja abaixo como contornar o problema.

1) Edite o arquivo /etc/fpc.cfg (você vai precisar editar com um editor de textos da sua preferência e com privilégios de super usuário, o sudo).

2) Procure pelo texto searchpath, você deve encontrar algo parecido com isso:

# searchpath for units and other system dependent things
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/*
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/rtl
#-Fu~/fpc/packages/base/*/units/;~/fpc/fcl/units/;~/fpc/rtl/units/

Perceba que o que deve estar errado é justamente a variável $fpcversion, no meu caso ao tentar compilar para Windows o Lazarus está usando a última versão que eu tenho, que é a 2.4.4 e as minhas units estão compiladas apenas para a versão 2.4.2, como eu sei disso? Simples, verifique o seu diretório /usr/lib/fpc e veja as versões que você tem disponíveis, no meu caso aparecem 2 diretórios, veja abaixo:

je@je:/usr/lib/fpc$ ls -l
total 8
drwxr-xr-x 3 root root 4096 2011-10-17 16:40 2.4.2
drwxr-xr-x 6 root root 4096 2011-10-17 16:41 2.4.4

E se eu tentar localizar a unit compilada system.ppu veja o que aparece:

je@je:/usr/lib/fpc$ locate system.ppu
/usr/lib/fpc/2.4.2/units/i386-win32/rtl/system.ppu
/usr/lib/fpc/2.4.4/units/i386-linux/rtl/system.ppu

Ou seja, a minha system.ppu (e muito provavelmente todas as outras) está compilada para Win32 no FPC 2.4.2 e no FPC para Linux na 2.4.4.

Agora que já deu pra identificar bem o problema a solução é bem simples.

3) No arquivo /etc/fpc.cfg que você já abriu e encontrou o searchpath, faça a seguinte alteração, substitua todo aquele texto mostrado no passo 2 pelo seguinte:

# searchpath for units and other system dependent things
#IFDEF win32
-Fu/usr/lib/fpc/2.4.2/units/$fpctarget
-Fu/usr/lib/fpc/2.4.2/units/$fpctarget/*
-Fu/usr/lib/fpc/2.4.2/units/$fpctarget/rtl
-XPfpc-i386-win32-
-FD/usr/bin
#ELSE linux
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/*
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/rtl
#-Fu~/fpc/packages/base/*/units/;~/fpc/fcl/units/;~/fpc/rtl/units/
#ENDIF

Note que o que eu fiz foi apenas uma seleção, ou seja, caso esteja sendo compilado para Win32 a versão do FPC utilizada será a 2.4.2 (hardcode) e caso esteja sendo compilado para Linux vai pegar automaticamente a última versão instalada através da variável $fpcversion.

É isso, agora se você ainda estava com o Lazarus aberto, feche e abra novamente para que ele carregue essas configurações na sua inicialização.

Creio que existem outras formas para resolver o problema e a mais correta seria recompilar as units para a última versão do FPC, mas essa creio que seja a mais rápida de resolver o problema e sem muita dor de cabeça.

Nenhum comentário:

Postar um comentário