Mostrando postagens com marcador windows. Mostrar todas as postagens
Mostrando postagens com marcador windows. Mostrar todas as postagens

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.

sábado, 27 de agosto de 2011

Compilando um programa para Windows no Linux

Estou usando Linux desde 2006, mas sempre existe alguns projetos em que não se pode fugir do Windows e pra isso eu sempre dependia de uma máquina virtual pra poder desenvolver, o que requer muito processamento e consequentemente uma máquina boa, ou depender do micro dos outros já que eu não cai na história de instalar o Linux em dual boot, se eu tivesse feito isso provavelmente até hoje eu estaria escolhendo entre um ou outro na hora do boot...

Bom, durante os meus muitos anos de usuário do Windows, a minha ide padrão foi o Delphi, então não foi por acaso que acabei caindo no Lazarus, a compatibilidade é grande mas não é 100%, não espere pegar um projeto grande feito em Delphi e migra-lo para o Lazarus sem ter problemas, mas a história do post não é bem essa, o que eu pretendia fazer e consegui é criar um novo projeto na minha máquina Linux e compilar o código gerando binários para o próprio Linux e para o Windows.

Então vamos aos pré-requisitos que já devem estar instalados:
1) Sistema Linux (dããhhh), atualmente estou usando o Kubuntu 11.04
2) Lazarus v0.9.30
3) FPC 2.4.2
4) FPC CROSSWIN32 2.4.2

Você pode baixar os arquivos de instalação aqui.

Faça a instalação dos pacotes baixados, se você não sabe como, faça uma busca no Mr.Google que você vai encontrar vários links ensinando como fazer.

Depois de tudo instalado, abra um terminal e acesse o diretório de instalação do Free Pascal Compiler, por default é o /usr/lib/fpc/2.4.2 e digite o comando abaixo:

sudo make OS_TARGET=win32

Feito isso agora basta criar o seu projeto normalmente no Lazarus e selecionar o sistema operacional de destino que deverá compilar para criar o binário.

As telas a seguir mostram as opções:

1) Selecione Project -> Project Options...
Nesta tela escolha em 'Compiler Options' o sistema operacional na opção 'LCL Widget Type (various)'


2) Ainda nesta tela agora escolha em 'Code generation' o sistema operacional na opção 'Target OS (-T)'


Clique no botão Ok e acesse a opção do menu principal 'Run->Build', se você fez tudo certo será criado um arquivo .exe com o nome do seu projeto no diretório onde o projeto foi salvo.

É só isso!!!