DOMANDA Conoscere su quale OS viene eseguito in programma

Matteo34

Nuovo Utente
104
3
CPU
i5-10500 3.2Ghz
Dissipatore
Non specificato
Scheda Madre
Non specificata
HDD
M.2 251GB e M.2 500GB
RAM
16GB DDR4 2666mhz
GPU
Grafica Intel® UHD 630
Audio
Non specificata
Monitor
1920x1080 27"
PSU
Non specificato
Case
Non specificato
Periferiche
Nono specificato
Net
Eolo
OS
Ubuntu
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 : )
 

alemian95

Utente Attivo
1,173
370
CPU
13600K
Dissipatore
Thermalright Peerless Assassin 120 SE
Scheda Madre
MSI PRO Z790-P WIFI ATX
HDD
WD Black 1TB SN850X
RAM
Kingston Fury Renegade DDR5 Silver 32GB 6400MT/s CL32
GPU
Gigabyte RTX 4070 Ti GAMING OC 12G
Monitor
BenQ MOBIUZ EX3415R
PSU
Thermaltake Toughpower GF3 750W
Case
NZXT H5 Flow
Periferiche
Mouse: Logitech G403 - Tastiera: Durgod Taurus K320
Net
FTTC 100 mega
OS
Windows 11 Home 64 bit
Cerchi qualcosa del genere?
 

Matteo34

Nuovo Utente
104
3
CPU
i5-10500 3.2Ghz
Dissipatore
Non specificato
Scheda Madre
Non specificata
HDD
M.2 251GB e M.2 500GB
RAM
16GB DDR4 2666mhz
GPU
Grafica Intel® UHD 630
Audio
Non specificata
Monitor
1920x1080 27"
PSU
Non specificato
Case
Non specificato
Periferiche
Nono specificato
Net
Eolo
OS
Ubuntu
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
 

Lorenzo Lanas

Utente Attivo
1,486
886
CPU
AMD Ryzen 5 5600X (Zen 3)
Dissipatore
Arctic Liquid Freezer II 360
Scheda Madre
MSI MAG B550 Tomahawk
RAM
Crucial Ballistix DDR4, 2x8GB, 3200 MHz, CL16
GPU
ASUS GeForce RTX 3060 Ti V2 DUAL MINI
Monitor
AOC 24G2U/BK 24" IPS, FHD 1920x1080 @ 144 Hz
PSU
Cooler Master Silent Pro Gold 600W
Case
Fractal Design Define 7 Solid Black&White
OS
Windows 10
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.
 

alemian95

Utente Attivo
1,173
370
CPU
13600K
Dissipatore
Thermalright Peerless Assassin 120 SE
Scheda Madre
MSI PRO Z790-P WIFI ATX
HDD
WD Black 1TB SN850X
RAM
Kingston Fury Renegade DDR5 Silver 32GB 6400MT/s CL32
GPU
Gigabyte RTX 4070 Ti GAMING OC 12G
Monitor
BenQ MOBIUZ EX3415R
PSU
Thermaltake Toughpower GF3 750W
Case
NZXT H5 Flow
Periferiche
Mouse: Logitech G403 - Tastiera: Durgod Taurus K320
Net
FTTC 100 mega
OS
Windows 11 Home 64 bit
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.
 

pabloski

Utente Èlite
2,868
916
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.
 

Matteo34

Nuovo Utente
104
3
CPU
i5-10500 3.2Ghz
Dissipatore
Non specificato
Scheda Madre
Non specificata
HDD
M.2 251GB e M.2 500GB
RAM
16GB DDR4 2666mhz
GPU
Grafica Intel® UHD 630
Audio
Non specificata
Monitor
1920x1080 27"
PSU
Non specificato
Case
Non specificato
Periferiche
Nono specificato
Net
Eolo
OS
Ubuntu
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
 

pabloski

Utente Èlite
2,868
916
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?
 
  • Mi piace
Reazioni: alemian95

Matteo34

Nuovo Utente
104
3
CPU
i5-10500 3.2Ghz
Dissipatore
Non specificato
Scheda Madre
Non specificata
HDD
M.2 251GB e M.2 500GB
RAM
16GB DDR4 2666mhz
GPU
Grafica Intel® UHD 630
Audio
Non specificata
Monitor
1920x1080 27"
PSU
Non specificato
Case
Non specificato
Periferiche
Nono specificato
Net
Eolo
OS
Ubuntu
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
 

alemian95

Utente Attivo
1,173
370
CPU
13600K
Dissipatore
Thermalright Peerless Assassin 120 SE
Scheda Madre
MSI PRO Z790-P WIFI ATX
HDD
WD Black 1TB SN850X
RAM
Kingston Fury Renegade DDR5 Silver 32GB 6400MT/s CL32
GPU
Gigabyte RTX 4070 Ti GAMING OC 12G
Monitor
BenQ MOBIUZ EX3415R
PSU
Thermaltake Toughpower GF3 750W
Case
NZXT H5 Flow
Periferiche
Mouse: Logitech G403 - Tastiera: Durgod Taurus K320
Net
FTTC 100 mega
OS
Windows 11 Home 64 bit

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!