Pergunta

O que devemos ter em mente ao escrever aplicativos multiplataforma em C?Plataformas direcionadas:PC baseado em Intel de 32 bits, Mac e Linux.Estou procurando especialmente o tipo de versatilidade que o Jungle Disk tem em sua edição USB para desktop ( http://www.jungledisk.com/desktop/download.aspx )

Quais são as dicas e “pegadinhas” para esse tipo de desenvolvimento?

Foi útil?

Solução

Mantive por vários anos uma biblioteca de rede ANSI C que foi portada para cerca de 30 sistemas operacionais e compiladores diferentes.A biblioteca não possuía nenhum componente GUI, o que tornava tudo mais fácil.Acabamos abstraindo em arquivos de origem dedicados qualquer rotina que não fosse consistente entre plataformas e usamos #defines quando apropriado nesses arquivos de origem.Isso manteve o código ajustado por plataforma isolado da lógica de negócios principal da biblioteca.Também fizemos uso extensivo de typedefs e nossos próprios tipos dedicados para que pudéssemos alterá-los facilmente por plataforma, se necessário.Isso tornou a portabilidade para plataformas de 64 bits bastante fácil.

Se você deseja componentes GUI, sugiro consultar kits de ferramentas GUI, como WxWindows ou Qt (que são bibliotecas C++).

Outras dicas

Tente evitar #ifdefs dependentes de plataforma, pois eles tendem a crescer exponencialmente quando você adiciona novas plataformas.Em vez disso, tente organizar seus arquivos de origem como uma árvore com código independente de plataforma na raiz e código dependente de plataforma nas "folhas".Há um livro legal sobre o assunto, Gerenciamento de código multiplataforma.O código de exemplo nele pode parecer obsoleto, mas as ideias descritas no livro ainda são brilhantemente vitais.

Além da resposta de Kyle, eu recomendaria fortemente contra tentando usar o subsistema Posix no Windows.Ele é implementado em um nível mínimo absoluto, de modo que a Microsoft pode reivindicar "suporte Posix" em uma caixa de seleção da folha de recursos.Talvez alguém por aí realmente o use, mas nunca o encontrei na vida real.

Certamente é possível escrever código C multiplataforma, basta estar ciente das diferenças entre plataformas e testar, testar, testar.Os testes de unidade e uma solução de CI (integração contínua) contribuirão muito para garantir que seu programa funcione em todas as plataformas de destino.

Uma boa abordagem é isolar o material dependente do sistema em um ou no máximo alguns módulos.Forneça uma interface independente do sistema desse módulo.Em seguida, construa todo o resto sobre esse módulo, para que não dependa do sistema para o qual você está compilando.

Tente escrever o máximo que puder com POSIX.Mac e Linux suportam POSIX nativamente e o Windows possui um sistema que pode executá-lo (até onde eu sei - nunca o usei).Se o seu aplicativo for gráfico, tanto o Mac quanto o Linux suportam bibliotecas X11 (Linux nativamente, Mac por meio do X11.app) e há inúmeras maneiras de fazer com que os aplicativos X11 sejam executados no Windows.

No entanto, se você estiver procurando por uma verdadeira implantação multiplataforma, provavelmente deverá mudar para uma linguagem como Java ou Python, que seja capaz de executar o mesmo programa em vários sistemas com pouca ou nenhuma alteração.

Editar:Acabei de baixar o aplicativo e olhei os arquivos.Parece ter binários para todas as três plataformas em um diretório.Se a sua preocupação é como escrever aplicativos que podem ser movidos de uma máquina para outra sem perder as configurações, você provavelmente deve gravar toda a sua configuração em um arquivo no mesmo diretório do executável e não tocar no registro do Windows ou criar qualquer diretório de ponto em a pasta pessoal do usuário que está executando o programa no Linux ou Mac.E no que diz respeito à criação de um binário Linux de distribuição cruzada, POSIX/X11 de 32 bits provavelmente seria a aposta mais segura.Não tenho certeza do que o JungleDisk usa, pois atualmente estou em um Mac.

Existem algumas bibliotecas portáteis, apenas exemplos em que trabalhei no passado

1) simplista e gtk+

2) libcurl

3) libapr

Eles cobrem quase todas as plataformas e, portanto, são ferramentas extremamente úteis.

Posix é bom no Unices, mas duvido que seja tão bom no Windows, além de não termos nenhum material para GUIs portáteis lá.

O XVT tem uma API GUI C de plataforma cruzada com mais de 15 anos de idade e que se baseia nos kits de ferramentas de janelas nativas. Consulte WWW.XVT.COM.

Eles suportam pelo menos LINUX, Windows e MAC.

Também apoio a recomendação de separar o código para diferentes plataformas em diferentes módulos/árvores em vez de ifdefs.

Também recomendo verificar antecipadamente quais são as diferenças em suas plataformas e como você pode abstraí-las.Por exemplo.isso é algo relacionado ao sistema operacional (por exemplo,o irritante CR, CRLF, LF em arquivos de texto) ou coisas de hardware.Por exemplo.a compatibilidade posix mencionada anteriormente não impede você de

int c;
fread(&c, sizeof(int), 1, file);

Mas em diferentes plataformas de hardware o layout da memória interna pode ser completamente diferente (endianess), forçando você a usar funções de conversão em algumas das plataformas alvo.

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