Написание кроссплатформенных приложений на C

StackOverflow https://stackoverflow.com/questions/35700

  •  09-06-2019
  •  | 
  •  

Вопрос

О чем следует помнить при написании кроссплатформенных приложений на C? Целевые платформы: 32-битный ПК на базе Intel, Mac и Linux. Я особенно ищу тип универсальности, который Jungle Disk имеет в своей настольной версии USB ( http: / /www.jungledisk.com/desktop/download.aspx )

Что такое советы и "ошибки"? для этого типа развития?

Это было полезно?

Решение

В течение нескольких лет я поддерживал сетевую библиотеку ANSI C, которая была портирована на 30 различных ОС и компиляторов. В библиотеке не было никаких компонентов GUI, что облегчало работу. В итоге мы абстрагировали в выделенные исходные файлы любую подпрограмму, которая не согласовывалась на разных платформах, и в соответствующих случаях использовали #defines в этих исходных файлах. Это держало код, который был приспособлен для каждой платформы, изолированным от основной бизнес-логики библиотеки. Мы также широко использовали typedefs и наши собственные выделенные типы, чтобы при необходимости мы могли легко менять их для каждой платформы. Это сделало перенос на 64-битные платформы довольно простым.

Если вам нужны компоненты GUI, я бы посоветовал взглянуть на наборы инструментов GUI, такие как WxWindows или Qt (обе библиотеки C ++).

Другие советы

Старайтесь избегать зависимых от платформы #ifdefs, так как они имеют тенденцию к экспоненциальному росту при добавлении новых платформ. Вместо этого попробуйте организовать исходные файлы в виде дерева с независимым от платформы кодом в корне и зависимым от платформы кодом на «листьях». На эту тему есть хорошая книга, Управление мультиплатформенным кодом . Пример кода в нем может выглядеть устаревшим, но идеи, описанные в книге, по-прежнему чрезвычайно важны.

В дополнение к ответу Кайла, я настоятельно рекомендую против пытаться использовать подсистему Posix в Windows. Он реализован на абсолютно минимальном уровне, так что Microsoft может претендовать на «поддержку Posix». на поле для галочки. Возможно, кто-то там действительно использует это, но я никогда не сталкивался с этим в реальной жизни.

Конечно, можно написать кросс-платформенный код на C, нужно просто знать о различиях между платформами и тестировать, тестировать, тестировать. Модульные тесты и решение CI (непрерывная интеграция) во многом помогут убедиться, что ваша программа работает на всех ваших целевых платформах.

Хороший подход состоит в том, чтобы изолировать системно-зависимые элементы максимум в одном или нескольких модулях. Обеспечить независимый от системы интерфейс из этого модуля. Затем создайте все остальное поверх этого модуля, чтобы оно не зависело от системы, для которой вы компилируете.

Старайся писать как можно больше с помощью POSIX. Mac и Linux изначально поддерживают POSIX, и в Windows есть система, которая может его запускать (насколько я знаю - я никогда не использовал его). Если ваше приложение графическое, Mac и Linux поддерживают библиотеки X11 (изначально Linux, Mac через X11.app), и существует множество способов заставить приложения X11 работать в Windows.

Однако, если вы ищете настоящее мультиплатформенное развертывание, вам, вероятно, следует переключиться на язык, такой как Java или Python, который способен запускать одну и ту же программу на нескольких системах практически без изменений.

Изменить: я только что скачал приложение и посмотрел на файлы. Похоже, что он имеет двоичные файлы для всех 3 платформ в одном каталоге. Если вас беспокоит то, как писать приложения, которые можно перемещать с компьютера на компьютер без потери настроек, вам, вероятно, следует записать всю свою конфигурацию в файл в том же каталоге, что и исполняемый файл, и не трогать реестр Windows или создавать какие-либо точечные каталоги в домашняя папка пользователя, который запускает программу на Linux или Mac. А что касается создания бинарного дистрибутива Linux, 32-разрядная версия POSIX / X11, вероятно, будет самым безопасным выбором. Я не уверен, что JungleDisk использует, так как сейчас я на Mac.

Существует довольно мало переносимых библиотек, только примеры, с которыми я работал в прошлом

1) glib и gtk +

2) libcurl

3) libapr

Они охватывают практически каждую платформу и поэтому являются чрезвычайно полезным инструментом.

Posix отлично подходит для Unices, но я сомневаюсь, что он отлично подходит для Windows, к тому же у нас нет ничего для переносимых графических интерфейсов.

XVT имеют кроссплатформенный API-интерфейс GUI C, который существует более 15 лет и находится поверх встроенных оконных сборок. См. WWW.XVT.COM.

Они поддерживают как минимум LINUX, Windows и MAC.

Я также рекомендую разделить код для разных платформ на разные модули / деревья вместо ifdefs.

Также я рекомендую заранее проверить, в чем различия между вашими платформами и как вы можете их абстрагировать. Например. это некоторые связанные с ОС вещи (например, раздражающие CR, CRLF, LF в текстовых файлах) или аппаратные вещи. Например. предыдущая совместимость с posix не мешает вам

int c;
fread(&c, sizeof(int), 1, file);

Но на разных аппаратных платформах структура внутренней памяти может быть совершенно разной (endianess), что заставляет вас использовать функции преобразования на некоторых целевых платформах.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top