Общерешение определяет в Visual Studio?

У меня есть очень большое приложение, созданное с использованием Visual Studio 2008, которое предназначено для работы в Windows XP. Код состоит из одного файла решения, который содержит шесть отдельных проектов. Моя работа состоит в том, чтобы портировать это приложение для работы в Linux. Я не делал ничего подобного раньше.

Вчера я обнаружил, что моя компания хочет, чтобы этот код по-прежнему компилировался в Windows, когда я закончу с ним. Моя первая идея для достижения этого состоит в том, чтобы использовать оператор препроцессора, такой как:

#define COMPILE_FOR_LINUX

Затем я мог бы указать компилятору, какие файлы включать в заголовки, используя такие блоки препроцессора:

#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

После включения соответствующих файлов я мог инкапсулировать весь зависящий от платформы код с помощью таких блоков:

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

Чтобы кому-то было как можно проще скомпилировать приложение для предпочтительной платформы, я бы хотел, чтобы COMPILE_FOR_LINUX был указан только в одном месте. Однако я не уверен, как это сделать.

Одна из моих идей заключалась в том, чтобы создать пустой заголовочный файл, а затем включить этот заголовочный файл в каждый отдельный файл решения, как указано в пути включения файла решения Visual Studio. Для Linux у меня была бы другая версия заголовочного файла, которая определяет COMPILE_FOR_LINUX, а затем Makefile указывал бы на эту версию, а не на пустую. Однако я уверен, что это очень грубое решение, и я не уверен, что оно вообще сработает.

Может ли кто-нибудь предложить более элегантный метод глобального определения чего-либо или создания переменной таким образом, чтобы ее мог видеть каждый файл в решении?


person Alex Jansen    schedule 02.08.2012    source источник
comment
На всякий случай другие люди ищут это: stackoverflow.com/questions/5268177/   -  person Peter M    schedule 27.07.2016


Ответы (1)


Это зависит от используемого вами компилятора, но для gcc вы можете указать директивы препроцессора из командной строки, поэтому вам просто нужно добавить COMPILE_FOR_LINUX в ваш make-файл.

g++ -DCOMPILE_FOR_LINUX .....

Для окон, если вы используете MSVS, вы можете изменить вкладку Preprocessor directives в свойствах проекта (на самом деле вам не нужно, так как COMPILE_FOR_LINUX не определено, но вы можете добавить COMPILE_FOR_WINDOWS для согласованности).

person Luchian Grigore    schedule 02.08.2012
comment
Это звучит многообещающе. Спасибо! - person Alex Jansen; 02.08.2012
comment
Разве это не должно быть -DCOMPILE_FOR_LINUX? - person mort; 02.08.2012
comment
@mort Не знаю, давно не работал с gcc. Это? - person Luchian Grigore; 02.08.2012
comment
Кроме того, я бы НЕ стал использовать флаг COMPILE_FOR_WINDOWS — что делать, если оба или ни один из них не определен? - person mort; 02.08.2012
comment
Да, это. См. stackoverflow.com/questions/2410976/ для примеров. - person mort; 02.08.2012
comment
@mort Просто убедитесь, что вы определили их тогда. Что делать, если вы компилируете для Linux, а COMPILE_FOR_LINUX не определено? То же самое. Кроме того, это упрощает добавление новых платформ. - person Luchian Grigore; 02.08.2012
comment
но что бы вы сделали, если определено более одного? Если COMPILE_FOR_LINUX не определен, вы будете компилировать для Windows. Что бы вы сделали, если бы оба были определены? Вы получите несколько неприятных ошибок, если, например, включите файлы как для Linux, так и для Windows. - person mort; 02.08.2012
comment
@mort это хорошо. Ошибки укажут, что вы делаете что-то не так, т.е. определяете оба файла. Ошибки компилятора — это хорошо. - person Luchian Grigore; 02.08.2012
comment
Полезные ошибки компилятора — это хорошо. Я полагаю, вы могли бы проверить определения в самом начале, чтобы получить полезное сообщение об ошибке и избежать неприятных сюрпризов. - person mort; 02.08.2012
comment
@mort Я имел в виду определение обоих макросов в своем комментарии. - person Luchian Grigore; 02.08.2012