2012-08-02 17 views
5

Ho un'applicazione molto grande creata utilizzando Visual Studio 2008 che è progettato per funzionare su Windows XP. Il codice è costituito da un file di soluzione che contiene sei progetti separati. Il mio compito è quello di portare questa applicazione per l'esecuzione su Linux. Non ho mai fatto nulla di simile prima.Definite a livello di soluzione in Visual Studio?

Ho scoperto ieri che la mia azienda desidera che questo codice sia ancora compilato su Windows una volta che ho finito. La mia prima idea per realizzare questo è di usare una dichiarazione preprocessore come ad esempio:

#define COMPILE_FOR_LINUX 

Poi, ho potuto dire al compilatore i file da includere nelle intestazioni utilizzando blocchi del preprocessore come questi:

#ifdef COMPILE_FOR_LINUX 
// include required Linux headers here and skip Windows header includes 
#else 
// include required Windows headers here and skip Linux header includes 
#endif 

Dopo compresi i file appropriati, ho potuto incapsulare tutto il codice dipendente piattaforma con blocchi come questi:

#ifdef COMPILE_FOR_LINUX 
// compile Linux specific code used here. 
#else 
// compile Windows specific code used here. 
#endif 

al fine di rendere il più semplice possibile per qualcuno di c Compilare l'applicazione per la loro piattaforma preferita, mi piacerebbe avere COMPILE_FOR_LINUX specificato in un solo posto. Tuttavia, non sono sicuro di come farlo.

Un'idea che avevo era di creare un file di intestazione vuoto e quindi avere ogni singolo file nella soluzione include questo file di intestazione come specificato nel percorso di inclusione del file di soluzione di Visual Studio. Per Linux, avrei un'altra versione del file di intestazione che definisce COMPILE_FOR_LINUX, quindi il makefile punta a questa versione anziché a quella vuota. Tuttavia, sono sicuro che questa è una soluzione molto approssimativa, e non sono sicuro che funzionerà.

Qualcuno potrebbe suggerire un metodo più elegante per definire qualcosa globalmente o creare una variabile in modo tale che ogni file nella soluzione possa vederlo?

+0

Nel caso in cui altre persone lo stiano cercando: http://stackoverflow.com/questions/5268177/è-questo-questo-per-definire-constant-on-a-solution-basis –

risposta

3

Dipende dal compilatore che si sta utilizzando, ma per gcc è possibile specificare direttive del preprocessore dalla riga di comando, quindi avrai solo bisogno di aggiungere COMPILE_FOR_LINUX nel makefile.

g++ -DCOMPILE_FOR_LINUX ..... 

Per le finestre, se si utilizza MSVS, è possibile modificare la scheda Preprocessor directives nelle proprietà del progetto (in realtà, non è necessario, dal momento che COMPILE_FOR_LINUX non è definito, ma è possibile aggiungere un COMPILE_FOR_WINDOWS di coerenza) .

+0

Sembra promettente. Grazie! –

+0

Non dovrebbe essere -DCOMPILE_FOR_LINUX? – mort

+0

@mort Non lo so, non ho lavorato con gcc da un po '. È? –