Самый простой способ построения кросс-платформенного приложения

Я прочитал несколько статей в кросс-платформенном теге. Однако, когда я запускаю новое приложение (в основном, приложение терминала/консоли), мне интересно, как проще всего сделать его кросс-платформенным (т.е. Работать в Linux, Mac OS X и Windows). Я подумал о следующем:

  • добавление различных макросов/тегов в мой код для создания различных исполняемых файлов для каждой операционной системы
  • используйте платформу Qt для разработки кросс-функционального приложения (хотя компонент GUI и платформы добавит больше времени разработки, поскольку я не знаком с Qt)

Ваши мысли? Заранее благодарим за ваш вклад!

Изменить: похоже, на Java и Qt существует множество популярных ответов. Каковы компромиссы между этими двумя, пока мы на нем?

Ответы

Ответ 1

Не идите первым путем. Вы столкнетесь с множеством проблем, которые уже решены для вас многочисленными инструментами.

Qt - отличный выбор, если вы определенно хотите С++. Фактически, это ускорит разработку, даже если вы не знакомы с ней, так как она имеет отличную документацию и проста в использовании. Хорошая роль в этом заключается в том, что это не просто графический интерфейс, но и сетевое взаимодействие, XML, ввод-вывод и множество других вещей, которые вам, вероятно, понадобятся.

Если не нужен С++, я бы пошел с Java. С++ - язык слишком низкого уровня для большинства приложений. Отладка управления памятью и поврежденных стеков может стать кошмаром.

К вашему отредактированному вопросу:

  • Очевидный: Java имеет сбор мусора, С++ - нет. Это означает отсутствие утечек памяти в Java (если вы не подсчитаете возможные ошибки в JVM), не нужно беспокоиться об оборванных указателях и т.д.
  • Еще одно очевидное: очень просто использовать платформозависимый код в С++ с помощью #ifdefs. В Java это настоящая боль. Существует JNI, но это не так просто.
  • Java имеет очень обширную поддержку исключений. Хотя С++ имеет исключения, Qt не использует их, а некоторые вещи, которые генерируют исключения в Java, оставят вас с поврежденной памятью и сбой в С++ (переполнение буфера сообщений).
  • "Пишите один раз, бегите везде". Перекомпиляция программы на С++ для многих платформ может быть сложной задачей. Программы Java не нужно перекомпилировать.
  • Он открыт для обсуждения, но я думаю, что Java имеет более обширную и четко определенную библиотеку. Уровень абстракции обычно выше, интерфейсы более чистые. И он поддерживает более полезные вещи, такие как схемы XML и т.д. Я не могу придумать функцию, присутствующую в Qt, но отсутствующую в Java. Может быть, мультимедиа или что-то еще, я не уверен.
  • Оба языка очень быстрые в настоящее время, поэтому производительность, как правило, не является проблемой, но Java может стать настоящим болотом памяти. Не очень важно и для современного оборудования, но все же.
  • Наименее очевидный: С++ может быть более переносимым, чем Java. Одним из примеров является ОС FreeBSD, которая была очень плохой поддержкой Java некоторое время назад (не знаю, если это все еще так). С++/Qt отлично работает. Если вы планируете поддерживать широкий спектр Unix-систем, С++ может быть лучшим выбором.

Ответ 2

Использовать Java. Как бы то ни было, когда он получает/используется, это лучшее, что нужно для работы на любой платформе. Конечно, вам все равно придется обрабатывать внешние функции, связанные с ОС, которые вы можете использовать, но это намного лучше, чем использование чего-либо еще.

Помимо Java, есть несколько вещей, которые вы можете запустить на JVM - JRuby, Jython, Scala приходят на ум.

Вы также можете писать на языках сценариев (Ruby, Python и т.д.).

C/С++ лучше всего использовать для приложений, требующих полного управления памятью и высокой управляемости.

Ответ 3

Я бы выбрал вариант QT (или некоторую другую структуру). Если вы поедете с первым, вы найдете его значительно сложнее. В конце концов, вы должны знать, что помещать в различные условно скомпилированные разделы для всех платформ, на которые вы нацеливаете.

Ответ 4

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

  • Java
  • XULRunner (платформа разработки Mozilla)

Конечно, всегда есть сеть. В основном я использую веб-приложения не только для их портативности, но также потому, что они работают на моем ПК с ОС Windows, моем компьютере Ubuntu и моем Mac.

В основном мы создаем веб-приложения, потому что Интернет - это будущее. Локальные приложения просматриваются в моей организации как в основном устаревшие, если, конечно, нет какой-либо функции или технологии, которые веб-интерфейс еще не поддерживает, поскольку это приложение возвращается из полностью веб-сайта.

Ответ 5

Если вы создаете консольное приложение, вы можете использовать один и тот же источник для всех трех платформ, если будете придерживаться функций, определенных в библиотеках POSIX. Настройка среды сборки - самая сложная часть, особенно если вы хотите иметь возможность строить для нескольких платформ из одного и того же исходного дерева.

Ответ 6

Я бы сказал, что если вы действительно хотите использовать С++, QT - самый простой способ для кросс-платформенного приложения, я обнаружил, что использую QT, когда мне нужен интерфейс, хотя QT имеет большой набор библиотек, который делает почти все проще в С++.

Если вы не хотите использовать QT, вам нужен хороший дизайн и большая абстракция, чтобы сделать приложение cross-platfform.

Однако я использую все больше Python bindinq для QT для приложения среднего размера. Если вы работаете в консольном приложении и знаете немного питона, вы можете найти скрипты Python гораздо более удобными, чем С++. Это позволяет сохранить время, затрачиваемое на то, чтобы сосредоточиться на вашем приложении.

Ответ 7

Я бы также предложил Github electron, который позволяет создавать кросс-платформенные настольные приложения с помощью NodeJs и Google Chromium. Единственным недостатком этого метода является то, что электронное приложение работает намного медленнее, чем собственное приложение на С++ из-за слоев абстракции между Javascript и родным С++.