Написание кроссплатформенных приложений на C - PullRequest
11 голосов
/ 30 августа 2008

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

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

Ответы [ 7 ]

9 голосов
/ 30 августа 2008

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

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

7 голосов
/ 30 августа 2008

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

4 голосов
/ 30 августа 2008

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

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

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

0 голосов
/ 16 декабря 2008

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

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

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

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

0 голосов
/ 16 декабря 2008

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

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

0 голосов
/ 16 декабря 2008

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

1) glib и gtk +

2) libcurl

3) libapr

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

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

0 голосов
/ 30 августа 2008

Постарайтесь писать как можно больше с помощью 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.

...