Como faço para cruzar-compilação de código C no Windows para um binário também sejam executados em Unix (Solaris / HPUX / Linux)?

StackOverflow https://stackoverflow.com/questions/579695

Pergunta

Eu estive olhando em Cygwin / Mingw / lcc Eu gostava de ser capaz de compilar perl extensões C nativas em minhas janelas (de preferência sob cygwin) e, em seguida, executá-los em Solaris e HP unix sem qualquer barulho, isso é possível?

Isso tudo decorre da minha pergunta original perl cross-platform aqui .

Foi útil?

Solução

Cross-compiler são muito difíceis de configurar e começar a trabalhar corretamente.

Considere que (as pessoas no) NetBSD tem que colocar em uma enorme quantidade de trabalho para conseguir cross-compilação de trabalho, e eles estão executando o mesmo sistema operacional, apenas arquiteturas diferentes.

Você teria que, pelo menos, copiar todos os cabeçalhos do outro OSs para o Windows, e obter um cross-compilador, vinculador etc para o destino OS / arquitetura.

Também que pode muito bem não ser possível - perl e bibliotecas compartilhadas podem ser compilado com um compilador nativo / não-gcc que não estará disponível no Windows em tudo.

Outras dicas

(Esta é uma pergunta muito antiga, mas faltando alguma informação útil - Eu fiz pessoalmente isso para Solaris (SPARC e x86), AIX, HP-UX e Linux (x86, x64).)

  • Primeiros C ++ cross-compilado é muito mais difícil do que em linha reta C.

  • HP-UX de 32 bits PA-RISC não é suportado porque ele usa o formato SOM vez de ELF e binutils não (e provavelmente não irá nunca) SOM apoio. Em outras palavras, você só pode cross-compilação de 64 bits PA-RISC. (Requer chip de PA-RISC 2.0.)

  • Eu iria com mingw vez de cygwin, se você puder. Cygwin introduz um monte de dores de cabeça de permissão de arquivos e dependências cygwin1.dll que pode ser problemático. Se possível, no entanto, construir sobre linux. Tudo será muito mais rápido porque todas as ferramentas e scripts que você está executando são projetados para um ambiente onde exec e stat são operações rápidas. Windows + NTFS não é esse ambiente.

  • Comece com o script crosstools, mas estar preparado para gastar um muito de tempo com isso.

  • Tente com as mais recentes gcc / binutuils primeiros, mas se você não pode superar os problemas tentar cair de volta para pacotes antigos. Por exemplo. para Power3 (AIX) série gcc 4.x compilador cruzado gera código ruim, 3.x está bem.

  • Ao copiar libs nativas e cabeçalhos de certificar-se de que você está copiando a partir da máquina mais antiga é provável que você correr. Copiando uma nova libc significa que seu código não será executado em qualquer máquina com um libc mais velho.

  • Ao copiar libs nativas e cabeçalhos você provavelmente vai querer 'tar -h' para transformar links simbólicos para arquivos reais, também assistir que no Solaris alguns arquivos CRT objetos necessários são enterrados em um diretório cc, não em / usr / lib

Eu concordo com Douglas , que obter um compilador cruzado e funcionando é muito difícil de fazer. Este é geralmente, a sua escolha de último recurso. Se você é cintas de boot, ou fazer um binário para um dispositivo embutido, então muitas vezes compilação cruzada é sua única opção. Você deve ser confortável compilar seu próprio gcc sob Cygwin antes de considerar compilação cruzada. Para compilador cruzado, você precisa para construir um gcc para executar sob as janelas, mas que irá criar binários para a sua plataforma de execução. instruções de exemplo para fazer isso podem ser encontrados aqui .

Talvez você está querendo compilador cruzado, porque você não tem raiz e / ou não pode compilar em sua plataforma de destino. Por exemplo, eu tive um provedor de hospedagem que decorreu Redhat Linux. Eu poderia executar scripts Perl CGI e módulos associados, mas eu não poderia compilar na máquina de destino, e um bibliotecas eu construí tiveram que existe no meu próprio diretório.

Para resolver isso, eu poderia ter tentado compilador cruzado para minha plataforma de destino, mas em vez disso, decidi configurar uma série semelhante dentro de uma VM no Windows. De dentro do Cygwin, você pode criar um script que ssh é em sua VM, cópias sua fonte, e faz um completo configure / construção. O último passo foi implantar o artefato binário para o meu sistema hospedado.

Eu tive sucesso tanto Solaris 10 e Open Solaris rodando dentro de uma máquina virtual no Windows. Infelizmente, você pode ter mais dificuldade em executar HPUX sob uma VM.

Por que você não tenha um ler-se sobre "Grand Unified Builder" ( http://lilypond.org/ gub / e http://valentin.villenave.info/The-LilyPond -report-11 (seção # 4))

Eu não sei como ele funciona, mas GUB permite que os desenvolvedores Lilypond para compilar durante cerca de 11 plataformas em uma máquina Linux.

Compilar no Windows, em seguida, usar o Wine para executá-los em qualquer * nix. Ele funciona bem na maioria das vezes.

Não, isso não é possível no nível binário. Há tantas diferenças a nível binário entre os vários sistemas operacionais e CPUs.

Mas o que você pode fazer é fazer a tão compatíveis sua fonte extensões C que pode compilar para diferentes plataformas. C foi concebido como uma "linguagem assembly portátil". Enquanto você ficar com rotinas que são multi-plataforma, em seguida, eles normalmente irá trabalhar o mesmo. Você ainda precisará de teste porque pode haver bugs que existe em especial plataforma.

Isto não pode ser feito ... mas é que muito de um aborrecimento para recompilar o código sob Solaris ou HP?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top