Eu estava terminando um dos meus primeiros projetos em C ++, que é (de acordo com a estrutura) supostamente multiplataforma. Desenvolvi o projeto totalmente no Windows e no Visual Studio, pensando que, como as bibliotecas são todas multiplataforma, fazer a compilação do OSX "mais tarde" seria trivial. Isso acabou não sendo o caso, mas o "código do Windows" não funciona corretamente e teve alguns erros de compilação a serem corrigidos.
Quais técnicas existem para garantir antecipadamente que o código seja compatível com todas as plataformas? Desenvolvendo todas as plataformas simultaneamente, testando o código em todas as plataformas ao mesmo tempo, quando novos recursos são adicionados, em vez de desenvolver as diferentes versões da plataforma uma após a outra? (*)
Procurando aconselhar especificamente que não depende das ferramentas, mas "processos de desenvolvimento" que ajudam na compatibilidade entre plataformas, independentemente de quais ferramentas são usadas. Como o (*) acima.
Especificamente, estou desenvolvendo um plug-in VST com WDL-OL ( https://github.com/olilarkin/wdl-ol ) e algumas bibliotecas DSP de plataforma cruzada. Os projetos WDL-OL têm os projetos VS e Xcode configurados, mas acho que os problemas vêm das bibliotecas e depois das diferenças nos compiladores.
fonte
Respostas:
Criar código portátil pode ser muito desafiador.
Primeiro, alguns conselhos óbvios relacionados à linguagem:
Em seguida, algumas recomendações de design:
Finalmente os pontos delicados:
TCHAR
), mas isso pode ser desafiador em combinação com a biblioteca padrão (por exemplo,cout
vswcout
a ser usado dependendo se estiver usandochar
ouwchar_t
)Mas estes são apenas conselhos. Nesta área, você não pode obter certeza.
fonte
-Wall -Wextra -Werror
-pedantic
.Não há nada que possa garantir que o código seja compatível com outra plataforma além de construí-lo, executá-lo e testá-lo lá. Portanto, a abordagem de todas as pessoas sãs é criar, executar e testar seus aplicativos em todas as plataformas que eles projetam, que precisam ser construídas, executadas e testadas.
A Integração Contínua (IC) pode aliviar um pouco esse fardo para projetos menores, pois você pode obter agentes de compilação baratos ou gratuitos para algumas plataformas (principalmente Linux), fazer seu desenvolvimento no Windows e simplesmente retornar ao Linux quando houver um problema.
O OSX CI é bastante complicado.
fonte
Se você está solicitando "processos de desenvolvimento" e sua plataforma de desenvolvimento principal é o Windows com Visual Studio, sugiro que tente criar seu projeto sem o "windows.h" incluído. Você receberá muitos erros de compilação que apontarão para muitos lugares onde você precisará refatorar seu código. Por exemplo, 'DWORD' não será # definido e será necessário substituí-lo por
uint32_t
todos os lugares (google forstdint.h
e você encontrará informações úteis sobre tipos inteiros e suas definições entre plataformas). Em seguida, você precisará substituir todas as chamadas à API do Win32, como,Sleep()
com o equivalente em várias plataformas (novamente, o Google é seu melhor amigo, que mostrará perguntas e respostas relevantes nos sites stack * .com). Provavelmente, você não conseguirá encontrar todas as substituições relevantes de plataforma cruzada para seu código e precisará retornar suainclude "windows."
diretiva, mas colocá-la em baixo#ifdef _WIN32
- mais detalhes aquiContinue fazendo perguntas mais concretas e obtendo respostas - essa é uma sugestão geral para "o que deve ser o processo de desenvolvimento"
EDIT 1 Outra sugestão é usar gcc e / ou clang na sua máquina de desenvolvimento do Windows (junto com o Visual Studio)
fonte
Depende dos "alguns erros de compilação" mencionados. Sem saber o que eram, é impossível ser específico.
Eu tenho código de plataforma cruzada para Windows / Linux / iOS / Android / Mac. Cada nova plataforma trouxe alguns erros e avisos extras quando foi adicionada pela primeira vez. Você aprenderá rapidamente quais construções trazem problemas. Evite-os ou abstraia as diferenças em um cabeçalho com
#ifdef
s. Tente nunca#ifdef
entre plataformas dentro do seu próprio código.Um exemplo:
cria uma instância temporária da
MyClass
qual é excluída após omyfunction
retorno. Com alguns dos meus compiladores C ++, essa instância é de leitura / gravação (e o fato de ser temporário e em breve ser destruído não preocupa o compilador). Com outros,myfunction
deve ser redefinido para obter umconst MyClass &
, ou o compilador reclama. Não importa o que o padrão C ++ diz, ou qual compilador está certo e qual está errado. Depois de encontrar o erro de um par de vezes Sei de (a) quer declarar uma variável temporária do tipoMyClass
e passar que amyfunction
ou (b) declarar a referênciaconst
emmyfunction
e usarmutable
aqui e ali para deconstify.Conclusão: acumule experiência e desenvolva seus próprios padrões de codificação.
fonte
Uma maneira possível de ajudar a portabilidade seria confiar apenas nas declarações e recursos fornecidos pelo padrão C ++ 11 e usando bibliotecas e estruturas de plataforma cruzada como POCO e Qt .
Mas mesmo isso não é à prova de falhas. Lembre-se do aforismo
Com prática, disciplina e muita experiência, transferir um programa para outra plataforma geralmente pode ser feito rapidamente. Mas a experiência e o know-how são muito importantes.
fonte