DOMANDA Conoscere su quale OS viene eseguito in programma

Pubblicità

Matteo34

Nuovo Utente
Messaggi
104
Reazioni
3
Punteggio
45
Buonasera, scusate, vorrei sapere in che modo posso sapere se un programma viene eseguito su un determinato OS, la prima idea che mi è venuta è stata quella di usare le direttive preprocessore abbinandole con le macro implementate dai vari sistemi.
C:
#ifdef __unix__

//codice unix

...
Come scritto sopra doveri far compilare il programma all'utente visto che il preprocessore agisce prima della compilazione.
Vorrei sapere come faccio a stabilire ciò a runtime, per rendere il tutto più user-friendly?
grazie : )
 
Si, grazie mi ritornerà utile :) ma vorrei sapere se c'è un modo per fare si che l'utente non deva compilare il sorgente, usando le direttive preprocessore andrebbe ricompilato su ogni macchina con OS diverso
Cerchi qualcosa del genere?

Inviato da MI 8 tramite App ufficiale di Tom\'s Hardware Italia Forum
 
Ciao, penso di aver capito la domanda, ma non esiste una soluzione preconfezionata a livello di C/C++ ma dovrai per forza "inventartene" una da te. Ad esempio potresti fare qualcosa del tipo:

C++:
#if defined(_WIN32) || defined(WIN32)

#include <windows.h>

long long getOSVersion ()
{
    DWORD dwVersion = GetVersion ();
    return 0x0100000000 | dwVersion;
}

#elif defined(__unix__)

#include <sys/utsname.h>

long long getOSVersion ()
{
    struct utsname os;
    uname (&os);
    return 0x0200000000 | atoi (os.version);
}

#elif defined(__ANDROID__)

int getNDKVersion ()
{
// Qui bisogna usare NDK o con reflection su java o con le proprietà dirette
}

long long getOSVersion ()
{
    int versione = getNDKVersion();
    return 0x0300000000 | versione;
}

#else

long long getOSVersion ()
{
    return 0xFF00000000;
}

#endif

Poi ovviamente nel main del programma, o dove ti serve, chiami la funzione getOSVersion che lui avrà compilato a seconda del preprocessore. Non credo sia mai stata implementata soluzione universale, a livello di linguaggio, in forma assoluta.
 
usando le direttive preprocessore andrebbe ricompilato su ogni macchina con OS diverso
Sinceramente non credo che si possa compilare sia per Linux che per Windows in una sola volta, credo proprio che tu debba compilare due volte, magari usando qualcosa del genere
oppure se lavori da windows crea una macchina virtuale e compila da li.
 
Si, grazie mi ritornerà utile :) ma vorrei sapere se c'è un modo per fare si che l'utente non deva compilare il sorgente, usando le direttive preprocessore andrebbe ricompilato su ogni macchina con OS diverso

Inviato da MI 8 tramite App ufficiale di Tom\'s Hardware Italia Forum

Impossibile. Un programma eseguibile utilizza gli strumenti offerti dall'ambiente di runtime, cioè il formato dell'eseguibile ( ELF per sistemi Unix, PE per Windows, Mach-O per macOS ), il linker dinamico, le librerie crt. Tutte queste cose basilari sono differenti tra i vari sistemi operativi e vengono decise in fase di compilazione.

Non c'è verso di far andare un eseguibile Windows su Linux ( a meno di usare un qualcosa come Wine, ma non è il caso tuo ).

Ciò che chiedi diventa possibile usando ambienti runtime che astraggono il sistema operativo. Java con la sua JVM, per esempio. O .Net con .Net Core/Mono/.Net. Ma anche Python o qualsiasi altro linguaggio non compilato.
 
Grazie a tutti, devo per forza farlo compilare dall'utente, evb metterò un ReadMe su come fare :)
Ciao, penso di aver capito la domanda, ma non esiste una soluzione preconfezionata a livello di C/C++ ma dovrai per forza "inventartene" una da te. Ad esempio potresti fare qualcosa del tipo:

C++:
#if defined(_WIN32) || defined(WIN32)

#include 

long long getOSVersion ()
{
DWORD dwVersion = GetVersion ();
return 0x0100000000 | dwVersion;
}

#elif defined(__unix__)

#include utsname.h>

long long getOSVersion ()
{
struct utsname os;
uname (&os);
return 0x0200000000 | atoi (os.version);
}

#elif defined(__ANDROID__)

int getNDKVersion ()
{
// Qui bisogna usare NDK o con reflection su java o con le proprietà dirette
}

long long getOSVersion ()
{
int versione = getNDKVersion();
return 0x0300000000 | versione;
}

#else

long long getOSVersion ()
{
return 0xFF00000000;
}

#endif

Poi ovviamente nel main del programma, o dove ti serve, chiami la funzione getOSVersion che lui avrà compilato a seconda del preprocessore. Non credo sia mai stata implementata soluzione universale, a livello di linguaggio, in forma assoluta.

Inviato da MI 8 tramite App ufficiale di Tom\'s Hardware Italia Forum
 
Grazie a tutti, devo per forza farlo compilare dall'utente, evb metterò un ReadMe su come fare :)

Inviato da MI 8 tramite App ufficiale di Tom\'s Hardware Italia Forum

mi sfugge la ragione

non puoi semplicemente distribuire n pacchetti, ognuno compilato per una differente piattaforma?

in fondo l'obiettivo iniziale non era distribuire binari, evitando all'utente di dover compilare?
 
Esatto, ma io ho solo una macchina con Unix, e non ho modo di compilare il programma su altri OS
mi sfugge la ragione

non puoi semplicemente distribuire n pacchetti, ognuno compilato per una differente piattaforma?

in fondo l'obiettivo iniziale non era distribuire binari, evitando all'utente di dover compilare?

Inviato da MI 8 tramite App ufficiale di Tom\'s Hardware Italia Forum
 
Pubblicità
Pubblicità
Indietro
Top