@dztdlps1246dfh7885

Кроссплатформенное программирование на C?

Недавно, углубляясь в Си, заметил, что большинство людей в своих программах активно используют WinApi ( например, для создания GUI, для сетевого программирования ). Возникает резонный вопрос, а каким образом тогда адаптировать программу под Linux системы, например? Что делать в таком случае?
  • Вопрос задан
  • 547 просмотров
Решения вопроса 3
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
если коротко то стоимость программы становится в 2.5х больше.
Развернуто из винды ни кто не тащит программы в линукс, слишком маленькая аудитория, а вот обратный ход возможен.
UI делают на QT
сетевой стек Npcap WinPcap
Впрочем делают часто для галочки да и не все возможно перенести.

Типичный пример это NGINX, Apache

В общем старайтесь избегать кросплатформенных приложений, особенно на таком низком уровне.
Кросплатформенность хороша только в Java и NET и то с той оговоркой что пишите только серверные приложения.
Ответ написан
vabka
@vabka
Токсичный шарпист
Пихать повсюду #ifdef.
Язык си by design не очень кроссплатформенный.
Ответ написан
@rPman
Ну, про "большинство" мне кажется это преувеличение.

winapi ничем особым не отличается от других UI библиотек, чуть сложнее кастомизация, достаточно неудобная работа, C-структуры а не классы и старые форматы строк (и проблемы с кодировками). Главное его достоинство - минимальные требования к ресурсам, в том смысле что не нужно использовать какую то прослойку, формирующую свою логику и способ рисования UI только чтобы проще его было кастомизировать.. но если тебе нужен только голый функционал, тянуть весь этот лишний мусор психологически неприятно.
Когда то очень давно
, впечатлившись возможностями delphi и успешными потугами msvc сделать разработку UI удобным, пробовал реализовать некую IDE, позволяющую рисовать формочки и генирирующую чистый winapi код для их создания (никаких библиотек), попытка была так себе но идея витает до сих пор (надобности в этом теперь нет).

Ответ на вопрос - использовать libwine
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
@res2001
Developer, ex-admin
Тут не важно GUI или нет (может быть любой интерфейс - сеть, файлы, потоки, процессы, и т.п. системные интерфейсы). Подход один и тот же. Если нужна кроссплатформенность, то ищите кроссплатформенные библиотеки, реализующие нужный интерфейс. Если таких нет (видимо плохо искал), то пишите свою. Это довольно сложно.
Ответ написан
Комментировать
@Mercury13
Программист на «си с крестами» и не только
Что тогда делают? Есть три варианта.
1. Перейти на кроссплатформенную библиотеку (Qt, например).
2. Наладить свою небольшую библиотеку, которая когда-нибудь станет кроссплатформенной.
3. Наладить механизм псевдонимов.
Эти варианты можно объединять: что-то перевести на другую библиотеку, что-то написать своё.

Примеры из личного кода.

ОДИН. Ну, например, собственные механизмы работы с путями к файлам потихоньку уходят в сторону std::filesystem::path.

ДВА. Ну, допустим, сделал свою библиотеку доступа к файлам — бонуса три. 1) Есть функции вроде writeIW (Intel word). 2) Проще писать свои абстрактные потоки, чем с std. 3) Феноменальная скорость под Windows (использует нечастый, но быстрый overlapped API с двойной буферизацией). На остальных ОС — обычная обёртка над FILE*.

ТРИ. std::random_device из MinGW 9 давал детерминированную последовательность. Потом попытался бросить эту обходную ветку, но кто-то из программистов пожаловался — на его машине r_d просто не инициализировался.
#if defined(__MINGW32__) && defined(__GNUC__) && !defined(__clang__)

    #define MINGW_RANDOM_DEVICE_WORKAROUND

    class MingwRandomDevice {};  // куча WinApi, опустим
#else //defined(__MINGW32__) && defined(__GNUC__) && !defined(__clang__)
    #include <random>
    using MingwRandomDevice = std::random_device;
#endif //defined(__MINGW32__) && defined(__GNUC__) && !defined(__clang__)
Ответ написан
CityCat4
@CityCat4
Внимание! Изменился адрес почты!
большинство людей в своих программах активно используют WinApi

Смелое и голословное утверждение.

На С никто не пишет кроссплатформенных приложений. На С никто не пишет гуев - это сложно и никому не нужно. Гуи пишут на С++
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Давайте поговорим о шрифтах. В 2012 я перешел с windows7 на Linux. И первая проблема практической работы с десктопом заключалась в том что я начал менять шрифты. Вот не нравились мне не шрифты не алгоритмы их рендеринга. Надо отдать должное МС. Шрифты у них хорошие. Дизайнеры очень долго думали над ними. Вот. Когда вы заняты кросс-платформенным UI возникает проблема. - Где взять шрифты максимально похожие на оригинал. Высота. Кернинг. Все должно быть максимально похожим на оригинальный десктоп где идет разработка иначе дизайн разваливается. В годы развития Linux Suse я пытался устанавливать их десктопы и использовать. И самая большая визуальная проблема что я видел - это полный развал шрифтового оформления. Доходило до смешного. Я просто не мог прочитать кириллический месседж в окне. Текст - сползал куда-то за границу окна. Или текст успешно переносился а баттон сползал за границы окна. Вобщем проблем было масса. Я думаю что одна из главных проблем кросс-платформенного UI - это унификация шрифтов. И дело тут вовсе не в Qt или Gnome/Gtk или KDE. А дело в том что другая платформа понятия не имеет как должен выглядет текстовый месседж.
Ответ написан
Комментировать
leahch
@leahch Куратор тега Linux
3Д специалист. Долго, Дорого, Дерьмово.
В общем, на чистом C лучше не писать кроссплатформенные приложения с GUI.
Практически все кроссплатформенные GUI- библиотеки разрабатываются для С++ (за очень редким исключением).
Так что рекомендую погрузиться в C++ и взять или Qt или WxWidgets...
Ну, или программировать на opengl + glfw с расширениями :)
Ответ написан
Комментировать
@vanyamba-electronics
Кроссплатформенные приложения пишут на Java.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы