Подтвердить что ты не робот

Как написать программу на С++, которая легко скомпилируется в Linux и Windows?

Я делаю С++-программу.

Одна из моих самых больших неприятностей с С++ - это предполагаемая независимость платформы.

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

Конечно, вы всегда можете переключиться на некоторую эмуляцию, такую ​​как Cygwin и вино, но я прошу вас, нет ли другого пути?

4b9b3361

Ответ 1

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

Во-первых, вам нужно начать использовать какую-то кросс-платформенную систему сборки, например SCons. Во-вторых, вам нужно убедиться, что все библиотеки, которые вы используете, построены как кросс-платформенные. И второстепенный третий пункт, я бы рекомендовал использовать компилятор, который существует на всех ваших целевых платформах, здесь gcc (С++ является довольно сложным зверьком, и все компиляторы имеют свои собственные специфические особенности).

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

GTK + и QT - это два API, который поставляется со своими наборами виджета (кнопки, списки и т.д.), А wxWidgets - это скорее API-интерфейс обертки для текущего набор встроенных виджетах запущенных платформ. Это означает, что два бывших могут выглядеть немного по-другому по сравнению с остальной частью системы, в то время как последний будет выглядеть как родная программа.

И если вы участвуете в программировании игр, на выбор не меньше API, и все они также кросс-платформенные. Два наиболее полно признанных, о которых я знаю:

Оба из них содержат все, от графики до входных и аудиопрограмм, либо через плагины, либо встроенные.

Кроме того, если вы считаете, что стандартная библиотека на С++ немного отсутствует, проверьте Boost для некоторых общих целей, сладость платформы.

Удачи.

Ответ 2

С++ - это кросс-платформа. Проблема, с которой вам кажется, заключается в том, что вы используете библиотеки, зависящие от платформы.

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

Единственное решение - найти и использовать независимые от платформы библиотеки.

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

Ответ 3

Как только вы узнаете о gotchas, на самом деле это не так сложно. Весь код, который я в настоящее время работаю над компиляторами на 32-разрядной и 64-разрядной версиях Windows, обладает всеми преимуществами Linux, а также Unix (Sun, HP и IBM). Очевидно, что это не продукты GUI. Кроме того, мы не используем сторонние библиотеки, если мы сами их не компилируем.

У меня есть один файл .h, содержащий весь код, специфичный для компилятора. Например, Microsoft и gcc не согласны с тем, как указать 8-разрядное целое число. Итак, в .h, у меня есть

#if defined(_MSC_VER)
   typedef __int8 int8_t;
 #elif defined(__unix)
   typedef char int8_t;
 #endif

Также существует довольно много кода, который унифицирует некоторые вызовы функций нижнего уровня, например:

#if defined(_MSC_VER)
  #define SplitPath(Path__,Drive__,Name__,Ext__) _splitpath(Path__,Drive__,Dir__,Name__,Ext__)
#elif defined(__unix)
  #define SplitPath(Path__,Drive__,Name__,Ext__) UnixSplitPath(Path__,Drive__,Name__,Ext__)
#endif

Теперь, в этом случае, я считаю, что мне пришлось написать функцию UnixSplitPath() - будут моменты, когда вам нужно. Но большую часть времени вам просто нужно найти правильную функцию замены. В моем коде я назову SplitPath(), хотя это не родная функция на любой платформе; #defines будет сортировать его для меня. Чтобы тренироваться, требуется некоторое время.

Верьте или нет, мой файл .h всего 240 строк. Там действительно не так много. И это включает в себя обработку конечных проблем.

Некоторым элементам более низкого уровня потребуется условная компиляция. Например, в Windows я использую критические разделы, но в Linux мне нужно использовать pthread_mutex. CriticalSection были инкапсулированы в класс, и этот класс имеет много условной компиляции. Однако программа верхнего уровня полностью не осознает, что класс функционирует точно так же, независимо от платформы.

Другой секрет, который я могу вам дать, заключается в следующем: часто создавайте свой проект на всех платформах (особенно в начале). Это намного проще, когда вы пресекаете проблемы с компилятором в зародыше. Не ждите, пока вы закончите разработку, прежде чем пытаться перейти на межплатформенную платформу.

Ответ 4

Придерживайтесь ANSI С++ и библиотек, которые являются кросс-платформенными, и вы должны быть в порядке.

Ответ 5

Создайте низкоуровневый уровень, который будет содержать весь код, специфичный для платформы, в вашем проекте. Внедрите 2 версии этого уровня - один для Windows и один для Linux - с тем же интерфейсом и создайте их для 2-х библиотек. Получите доступ ко всем функциональным возможностям платформы в своем проекте через этот интерфейс.

Этот слой может содержать общие классы для доступа к файлам, печати, графического интерфейса и т.д.

Весь (теперь не-платформенный) код, который использует этот уровень, теперь может быть скомпилирован один раз в Windows и один раз в Linux.

Ответ 6

Скомпилируйте его в окне и снова в Linux. Если вы не используете библиотеки конкретной платформы, она должна работать. Это не похоже на Java, где вы ее компилируете один раз и работает повсюду. Никто не создал виртуальную машину для С++ и, вероятно, никогда этого не сделает. Код, который вы пишете на С++, будет работать на любой платформе. Вам просто нужно скомпилировать его на каждой платформе.

Ответ 7

Предложения:

  • Используйте typedef для int. Или #include < stdint.h > . Некоторые машины считают, что int 8 байт, некоторые 4. (Раньше было 2 и 4. Как изменились времена.)

  • Используйте инкапсуляцию, где это возможно. Мой последний компилятор окна думал, что% lld был% I64d ", дал верные возвращаемые значения для vsnprintf(), аналогичные проблемы с close() и сокетами и т.д.

  • Следите за ограничениями размера стека/размера буфера. Я столкнулся с 8-битовым UDP-буфером под Windows, среди других проблем.

  • По какой-то причине мой компилятор Window С++ не принимал динамические распределения по размеру из стека. Например: void foo (int a) {int b [a]; } Помните об этих вещах. Планируйте, как вы будете перекодировать.

  • #ifdef может быть вашим лучшим другом. И твой злейший враг! (В то же время!)

Это, безусловно, можно сделать. Но компилируйте и тестируйте рано и часто!

Ответ 9

Стандартный С++ - это компиляция кода без ошибок на любой платформе. Попробуйте использовать Bloodshed Dev С++ на окнах (вместо VС++/Borland С++).

Как Bloodshed Dev С++ подтверждает стандарты С++, поэтому скомпилированные с его помощью программы будут скомпилированы в Linux без ошибок в большинстве случаев.