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

$res = array(
    0=>array("id"=>9, "roi"=>0),
    1=>array("id"=>1,"roi"=>0),
    2=>array("id"=>10,"roi"=>0),
    3=>array("id"=>14,"roi"=>0),
    4=>array("id"=>4,"roi"=>0),
    5=>array("id"=>5,"roi"=>141),
    6=>array("id"=>6,"roi"=>2600));

$res4   =   array(); 
$count  = count($res);

for($i=$count-1;$i>=0;$i--){
    $res4[$i] =$res[$i]; 
}

print_r($res4);
16
задан SCdF 25 January 2009 в 21:15
поделиться

9 ответов

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

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

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

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

И если Вы в игры, программирующие, существуют одинаково многие API для выбора из, все они межплатформенные также. Два, самые полнофункциональные, о котором я знаю:

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

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

Удачи.

37
ответ дан 30 November 2019 в 15:18
поделиться

C++ является кросс-платформенным. Проблема, которую Вы, кажется, имеете, состоит в том, что Вы пользуетесь зависимыми библиотеками платформы.

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

единственное решение состоит в том, чтобы Вы нашли и пользовались независимыми от платформы библиотеками.

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

13
ответ дан 30 November 2019 в 15:18
поделиться

После того как Вы знаете о глюках, это на самом деле не настолько трудно. Весь код я в настоящее время работаю над компиляциями на 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 инкапсулировались в классе, и этот класс имеет большую условную компиляцию. Однако программа верхнего уровня полностью не знает, класс функционирует точно то же независимо от платформы.

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

9
ответ дан 30 November 2019 в 15:18
поделиться

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

2
ответ дан 30 November 2019 в 15:18
поделиться

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

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

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

1
ответ дан 30 November 2019 в 15:18
поделиться

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

0
ответ дан 30 November 2019 в 15:18
поделиться

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

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

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

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

  • По некоторым причинам, компилятор C++ моего Окна не принял бы динамически измеренные выделения от стека. Например: пустое нечто (интервал a) {интервал b;} знать о подобных вещах. Запланируйте, как Вы повторно кодируете.

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

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

0
ответ дан 30 November 2019 в 15:18
поделиться

Также Linux и Windows имеют другую модель данных. Статья See: проблемы, о которых забывают, 64-разрядной разработки программ

0
ответ дан 30 November 2019 в 15:18
поделиться

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

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

-1
ответ дан 30 November 2019 в 15:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: