Обнаружение компиляции Windows и * nix - PullRequest
2 голосов
/ 12 февраля 2010

Один проект должен быть скомпилирован для Windows, Linux и встроенной цели. Приложение имеет различия в поведении при работе на хосте или встроенных целях. Чтобы подвести итог моих требований, вот таблица:

   Target               Compiler      Behavior
   Windows              MSVC, gcc         A
   Host Linux           gcc               A
   Embedded Linux       cross pltf gcc    B

Я хочу создать Makefile, который бы автоматически распознавал различия между компилятором и средой (без необходимости передавать параметры / определения вручную). Можно ли решить эту проблему, просто используя условную компиляцию на уровне исходного файла C?
Пока я не пользуюсь automake.

Ответы [ 4 ]

6 голосов
/ 12 февраля 2010

autotools были созданы для решения этой проблемы. Makefile сам по себе не может этого сделать.

Что касается условной компиляции, есть несколько доступных макросов, которые определяют эти компиляторы (например, _MSC_VER для MSVC ++, _WIN32 для Windows и __linux__ для Linux). Кроме того, gcc предоставляет утверждений для обработки различных целей CPU .

Target         Compiler     Conditional
Windows        MSVC++       #ifdef _MSC_VER
Windows        gcc          #if defined(_WIN32) && defined(__GNUC__)
Linux          gcc          #if defined(__linux__) && defined(__GNUC__)
Platform (x86) gcc          #if #cpu(i386)
Platform (arm) gcc          #if #cpu(arm)

Этого должно быть достаточно для ваших целей.

2 голосов
/ 12 февраля 2010

Мой ответ: наверное. Это зависит от различий между средами.

Я бы сгенерировал список макросов, предопределенных препроцессором в gcc для каждой из ваших сред. Все, что вам нужно сделать, это создать пустой файл, скажем foo.h, и выполнить следующую команду: gcc -E -dM foo.h для каждой среды. Я бы перенаправил вывод в отдельный файл для каждой среды.

Затем сравните предопределенные макросы и найдите тот, который соответствует требованиям. В своем вопросе вы указали, что встроенная среда отличается от платформы Windows и Host Linux. Предполагая, что вы используете другую архитектуру микросхемы для встроенной среды, должен быть определен макрос, который указывает архитектуру. Например, в моей 64-битной Linux-системе определено __x86_64__.

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

#ifdef MACRO_INDICATING_EMBEDDED
// Behavior B
#else
// Behavior A
#endif
0 голосов
/ 12 февраля 2010

Вы можете попробовать комбинацию предопределенных макросов для операционных систем и для архитектур ; возможно также интересно: идентификаторы компилятора .

Если вы не хотите использовать более сложную систему сборки, вы можете проанализировать аргументы командной строки в вашем make-файле. Простым примером будет добавление .exe к именам исполняемых файлов в Windows. Для этого у меня есть такой код в make-файле

ifeq ($(target),win32)
    foo_binary := $(foo_binary).exe
endif

и вызовите make через файл make.bat, содержащий

@make.exe target=win32 %*
0 голосов
/ 12 февраля 2010

gcc будет определять

 __linux__

при компиляции на linux. MSVC определяет нечто подобное - я забыл, что, но я уверен, что документы скажут вам

но на самом деле вам нужно научиться использовать configure. Вот для чего это. Больно учиться, но очень полезно (automake, autoconf и т. Д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...