Ir ao conteúdo

sobre multiplataforma


Cambalinho

Posts recomendados

Postado

ja entendi que multiplataforma é que o codigo é compativel com qualquer sistema operativo. mas em vez de fazer o download total do QT, o que realmente preciso de fazer para nao necessitar de alterar o codigo todo para funcionar em Linux e outros?

penso que preciso de ter as libarias(*.h) correctas, mas nao conheço os termos, por isso nao sei o que procurar. alguem me pode ajudar?

Postado
ja entendi que multiplataforma é que o codigo é compativel com qualquer sistema operativo. mas em vez de fazer o download total do QT, o que realmente preciso de fazer para nao necessitar de alterar o codigo todo para funcionar em Linux e outros?

penso que preciso de ter as libarias(*.h) correctas, mas nao conheço os termos, por isso nao sei o que procurar. alguem me pode ajudar?

O C é uma das linguagens mais baixo nível que existem, sendo o assembly a mais baixo nível.

O problema que você citou é muito mais embaixo, na verdade o sistema operacional influencia muito menos do que o HARDWARE.

Ao não usar um framework, os comandos dados pela linguagem, podem ou não serem reconhecidos pelo S.O. e também pela arquitetura do HARDWARE, ou seja, o INT pode ter 2 ou 4 bytes. o BYTE padrão pode ser o com sinal ou sem sinal.

Quando você quer atingir uma margem de plataformas muito grande deve se preocupar com as implementações especificas.

Procure assim sempre usar as garantias da linguagem, não sei se vale para o C também, mas no C++ é garantido que o long sempre tem 4bytes no mínimo. Esse tipo de garantia lhe ajuda a programar para muitos hardwares.

Já o segundo ponto da compatibilidade, o C acredito que também deve estar na ISO, se esse for o caso procure usar sempre o padrão ISO ao invés dos comandos proprietários das implementações específicas. Ex: conio.h.

Já o QT imagino que seja um framework gráfico, logo realmente ele terá que ser distribuído junto.

Finalizando, o seu código sofre menos com modificações o quanto mais você usa o padrão e menos o proprietário. Como isso é praticamente impossível de ser alcançado 100%, isole o código QT e que depende de implementação específica em bibliotecas separadas. Assim ao mudar de plataforma você dá menos manutenção no código.

No core do sistema busque usar o ISO C.

Espero ter ajudado. PALAVRA CHAVE: c machine independent.

Reforçando, se você usar ISO C seu problema não será Linux/Windows e sim Hardware. Cuidado com a falta de garantias nos tipos.

Postado
O C é uma das linguagens mais baixo nível que existem, sendo o assembly a mais baixo nível.

O problema que você citou é muito mais embaixo, na verdade o sistema operacional influencia muito menos do que o HARDWARE.

Ao não usar um framework, os comandos dados pela linguagem, podem ou não serem reconhecidos pelo S.O. e também pela arquitetura do HARDWARE, ou seja, o INT pode ter 2 ou 4 bytes. o BYTE padrão pode ser o com sinal ou sem sinal.

Quando você quer atingir uma margem de plataformas muito grande deve se preocupar com as implementações especificas.

Procure assim sempre usar as garantias da linguagem, não sei se vale para o C também, mas no C++ é garantido que o long sempre tem 4bytes no mínimo. Esse tipo de garantia lhe ajuda a programar para muitos hardwares.

Já o segundo ponto da compatibilidade, o C acredito que também deve estar na ISO, se esse for o caso procure usar sempre o padrão ISO ao invés dos comandos proprietários das implementações específicas. Ex: conio.h.

Já o QT imagino que seja um framework gráfico, logo realmente ele terá que ser distribuído junto.

Finalizando, o seu código sofre menos com modificações o quanto mais você usa o padrão e menos o proprietário. Como isso é praticamente impossível de ser alcançado 100%, isole o código QT e que depende de implementação específica em bibliotecas separadas. Assim ao mudar de plataforma você dá menos manutenção no código.

No core do sistema busque usar o ISO C.

Espero ter ajudado. PALAVRA CHAVE: c machine independent.

Reforçando, se você usar ISO C seu problema não será Linux/Windows e sim Hardware. Cuidado com a falta de garantias nos tipos.

entendi ;)

mas ao falarmos de API ou para ser mais correcto: GUID, isso é diferente nos sistemas operativos. então o que preciso para resolver isso?

talvez precise de librarias correspondentes\especificas, mas eu nao sei o que procurar :(

diz-me o que preciso de procurar, por favor(se nao conhecer os termos, nao sei o que procurar)

Postado
entendi ;)

mas ao falarmos de API ou para ser mais correcto: GUID, isso é diferente nos sistemas operativos. então o que preciso para resolver isso?

talvez precise de librarias correspondentes\especificas, mas eu nao sei o que procurar :(

diz-me o que preciso de procurar, por favor(se nao conhecer os termos, nao sei o que procurar)

SE eu entendi o que você quis dizer, só tem essas opções:

- Recompilar o código na plataforma específica.

- WEB.

- Java, a VM mais instalada nos computadores pelo mundo.

Essa mágica que você quer de um .exe rodar em todos os lugares não existe.

O resto está explicado no meu post acima.

Procure na web por PORTABILIDADE.

Abs, e se não for isso espere por alguém mais especialista que eu.

https://qt-project.org/forums/viewthread/25490

https://qt-project.org/forums/viewthread/19756

Postado
SE eu entendi o que você quis dizer, só tem essas opções:

- Recompilar o código na plataforma específica.

- WEB.

- Java, a VM mais instalada nos computadores pelo mundo.

Essa mágica que você quer de um .exe rodar em todos os lugares não existe.

O resto está explicado no meu post acima.

Procure na web por PORTABILIDADE.

Abs, e se não for isso espere por alguém mais especialista que eu.

https://qt-project.org/forums/viewthread/25490

https://qt-project.org/forums/viewthread/19756

eu li á pouco 1 coisa: o "\n" continua a ser mudança de linha em Linux?

eu queria que o meu codigo fosse 100% valido em Linux e outros sistemas operativos. em Linux ou outros nao temos windows.h, então o que temos?

Postado

Me intrometendo no tópico sim, o linux reconhece "\n" como quebra de linha!

A algum tempo realizei um projeto para a faculdade onde deveria funcionar tanto para Linux quanto para Windows, uma dica que eu dou é usar o minimo do minimo de bibliotecas, ou seja, usar só as necessárias mesmo e bem se você que realmente certeza recomendo que ao longo do projeto teste tanto no Windows quanto no Linux.

@emanoelvianna

Postado

No meu maior projeto, atualmente, que é de química quântica, desenvolvo um código que seja usável no Linux, no Windows e no OSX.

Basicamente uso a tática do Emanoel.vianna, tentando diminuir o máximo a dependência de outras bibliotecas, procurar o máximo de soluções em bibliotecas standard, do próprio C++, e não aquelas especificas dos respectivos sistemas operacionais. Quando não dá pra fugir de usar algo especifico desse ou daquele SO, incluo as bibliotecas com macros, usando compilação condicional. De maneira que o mesmo código pode ser recompilado em vários sistemas apenas mudando algumas macros na hora instalação.

No meu caso, não tive como fugir por exemplo das bibliotecas Boost C++ e da GNU GSL. Nesse caso pretendo distribui-las junto com o programa quando ele estiver pronto.

Algo que não me preocupei ainda foi com o hardware. Confesso que o post do Edmorte me deu calafrios. :D

Postado
eu li á pouco 1 coisa: o "\n" continua a ser mudança de linha em Linux?

eu queria que o meu codigo fosse 100% valido em Linux e outros sistemas operativos. em Linux ou outros nao temos windows.h, então o que temos?

Para interface grafica, temos o xlib/x11.h, acredito eu que o QT no linux seja implementado pela x11, e no windows pela windows.h, o que o framework faz é encapsular todo o codigo e fazer que funcione de maneira identica, em diferentes OS. porém com QT você não pode usar coisas especificas do windows, como aumentar a borda do aero na parte superior, como neste exemplo: http://en.wikipedia.org/wiki/File:Aero_Example.png

Postado

muito obrigado a todos pela informaçao.

mas ainda tenho 1 duvida, como faço 1 'if condicional' entre sistemas operativos?

exemplo:

if (OS==WINDOWS)
{
Sleep(1000);
}
else
{
LinuxSleep(1000); //desculpa, mas nao sei qual é a funçao em Linux
}

apesar de nao saber quais sao as funçoes graficas de Linux, como posso fazer este tipo de 'if'?

Postado

Eu por exemplo, o que faço é colocar todas as partes do código que são exclusivas de cada sistema operacional entre as macros LINUX, WIN32 e OSX. E usar a compilação condicional:


#ifdef LINUX
[COLOR="Blue"]// Faço apenas coisas do Linux aqui[/COLOR]
#endif

#ifdef WIN32
[COLOR="blue"]// Faço apenas coisas do Windows aqui[/COLOR]
#endif

#ifdef OSX
[COLOR="blue"]// Faço apenas coisas do OSX aqui[/COLOR]
#endif

É obvio que apenas UMA dessas macros deve estar previamente definida com um #define. O que faço é: no script de instalação do programa ou no próprio makefile, reconhecer em qual sistema estou atualmente e adicionar a opção de definir macros na linha de comando do compilador. Por exemplo, se estou no Linux:


g++ bla bla bla -DLINUX

Que tem o mesmo efeito de


#define LINUX

E automaticamente ativa todas as partes do código exclusivas do Linux.

Postado
Eu por exemplo, o que faço é colocar todas as partes do código que são exclusivas de cada sistema operacional entre as macros LINUX, WIN32 e OSX. E usar a compilação condicional:


#ifdef LINUX
[COLOR="Blue"]// Faço apenas coisas do Linux aqui[/COLOR]
#endif

#ifdef WIN32
[COLOR="blue"]// Faço apenas coisas do Windows aqui[/COLOR]
#endif

#ifdef OSX
[COLOR="blue"]// Faço apenas coisas do OSX aqui[/COLOR]
#endif

É obvio que apenas UMA dessas macros deve estar previamente definida com um #define. O que faço é: no script de instalação do programa ou no próprio makefile, reconhecer em qual sistema estou atualmente e adicionar a opção de definir macros na linha de comando do compilador. Por exemplo, se estou no Linux:


g++ bla bla bla -DLINUX

Que tem o mesmo efeito de


#define LINUX

E automaticamente ativa todas as partes do código exclusivas do Linux.

desculpa mas nao entendi o:

#define LINUX

porque supostamente deveria ter 1 valor hexadecimal ou numerico a seguir ao nome, certo?

Postado
desculpa mas nao entendi o:

#define LINUX

porque supostamente deveria ter 1 valor hexadecimal ou numerico a seguir ao nome, certo?

Não necessariamente. Você pode definir macros sem um conteúdo propriamente dito. Em geral, pro uso que eu dou, decidir caminhos de compilação no #ifdef, não há necessidade de dar-lhe qualquer valor.

Postado
Não necessariamente. Você pode definir macros sem um conteúdo propriamente dito. Em geral, pro uso que eu dou, decidir caminhos de compilação no #ifdef, não há necessidade de dar-lhe qualquer valor.

então como o compilador reconhece ser windows ou linux?

Postado

Cambalinho,

então como o compilador reconhece ser windows ou linux?

Também é possível.. basta usar as macros que são definidas automaticamente pelos compiladores. Se você compilar esse programa no Windows (qualquer ambiente: MinGW/Cygwin), o primeiro printf será compilado, no linux, o segundo e, no caso de outro, uma mensagem de erro em tempo de compilação será apresentada.

#include <stdio.h>

int main()
{

#ifdef _WIN32
//coisas do Windows
printf("_WIN32");
#elif __linux__
//coisas do Linux
printf("__linux__");
#else
#error OS nao suportado!!
#endif

return 0;
}

[]'s

LNW

Postado
Cambalinho,

Também é possível.. basta usar as macros que são definidas automaticamente pelos compiladores. Se você compilar esse programa no Windows (qualquer ambiente: MinGW/Cygwin), o primeiro printf será compilado, no linux, o segundo e, no caso de outro, uma mensagem de erro em tempo de compilação será apresentada.

#include <stdio.h>

int main()
{

#ifdef _WIN32
//coisas do Windows
printf("_WIN32");
#elif __linux__
//coisas do Linux
printf("__linux__");
#else
#error OS nao suportado!!
#endif

return 0;
}

[]'s

LNW

muito obrigado... muito obrigado a tudos

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!