2012-08-02 15 views
5

Mam bardzo duże aplikacji zbudowane przy użyciu Visual Studio 2008, który jest przeznaczony do uruchamiania w systemie Windows XP. Kod składa się z jednego pliku rozwiązania, który zawiera sześć oddzielnych projektów. Moim zadaniem jest przeniesienie tej aplikacji na Linuksa. Nigdy wcześniej czegoś takiego nie robiłem.Definicja w całym interfejsie Visual Studio?

Odkryłem wczoraj, że moja firma życzy sobie, aby ten kod nadal się kompilował w systemie Windows, gdy skończę. Mój pierwszy pomysł dla osiągnięcia tego celu jest użyć instrukcji preprocesora takie jak:

#define COMPILE_FOR_LINUX 

Następnie mogę poinformować kompilator, który plików do uwzględnienia w nagłówkach z klocków preprocesora takie jak:

#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 

Po w tym odpowiednich plików, mogę ująć cały kod zależny od platformy z bloków takie jak:

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

aby uczynić to tak proste, jak to możliwe dla kogoś do C ompiluj aplikację na preferowaną platformę, chciałbym mieć podaną wartość COMPILE_FOR_LINUX tylko w jednym miejscu. Jednak nie jestem pewien, jak to osiągnąć.

Jednym z pomysłów było stworzenie pustego pliku nagłówkowego, a następnie każdy pojedynczy plik w rozwiązaniu zawiera ten plik nagłówkowy, jak określono w ścieżce pliku rozwiązania Visual Studio. W przypadku Linuksa, mam inną wersję pliku nagłówkowego, który definiuje COMPILE_FOR_LINUX, a następnie ma punkt makefile do tej wersji zamiast pustej. Jestem jednak pewien, że jest to bardzo prymitywne rozwiązanie i nie jestem pewien, czy to zadziała.

Czy ktokolwiek mógłby zaproponować bardziej elegancką metodę definiowania czegoś globalnie lub tworzenia zmiennej w taki sposób, aby każdy plik w rozwiązaniu mógł ją zobaczyć?

+0

Na wszelki wypadek, gdy szukają tego inni ludzie: http://stackoverflow.com/questions/5268177/is-there-anyway-to-define-constant-on-a-solution-basis –

Odpowiedz

3

To zależy od kompilatora, którego używasz, ale dla gcc można określić dyrektyw preprocesora z wiersza poleceń, więc po prostu trzeba dodać COMPILE_FOR_LINUX w makefile.

g++ -DCOMPILE_FOR_LINUX ..... 

dla Windows, jeśli przy użyciu MSVS można zmienić kartę we właściwościach projektu (faktycznie, nie trzeba, gdyż COMPILE_FOR_LINUX nie jest zdefiniowana, ale można dodać COMPILE_FOR_WINDOWS dla spójności) Preprocessor directives .

+0

Brzmi obiecująco. Dzięki! –

+0

Czy nie powinno to być -DCOMPILE_FOR_LINUX? – mort

+0

@mort Nie wiem, od jakiegoś czasu nie pracowałem z gcc. Czy to jest? –