Одновременная разработка C ++ для Linux и Windows - PullRequest
12 голосов
/ 04 августа 2009

У нас есть несколько разработчиков, работающих над некоммерческими (читай: просто для удовольствия) кроссплатформенный проект C ++. Мы уже определили все кроссплатформенные библиотеки, которые нам понадобятся. Однако некоторые наши разработчики предпочитают использовать Microsoft Visual C ++ 2008, другие предпочитают кодировать в Emacs на GNU / Linux. Мы задаемся вопросом, возможно ли для всех нас работать более или менее одновременно из обеих сред, из одного и того же хранилища кода. В конечном итоге мы хотим, чтобы проект с самого начала аккуратно компилировался на обеих платформах.

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

Любые предложения или опыт, чтобы поделиться?

Ответы [ 13 ]

15 голосов
/ 04 августа 2009

Используйте CMake для управления файлами сборки.

Это позволит вам настроить один репозиторий с одним набором текстовых файлов. Затем каждый разработчик может запустить соответствующие сценарии cmake для создания правильной среды сборки для своей системы (сценарии сборки Visual Studio 2008/2005 / GNU C ++ / и т. Д.).

Здесь много преимуществ:

  • Каждый разработчик может использовать свою собственную среду сборки
  • Зависимости могут быть обработаны очень аккуратно, в том числе для конкретных платформ.
  • Сборки могут быть вне источника, что помогает предотвратить случайную фиксацию неподходящих файлов
  • Простая миграция на нового разработчика. окружения (то есть: когда выйдет VS 2010, некоторые разработчики могут перейти на него, просто перестроив свою папку сборки)
12 голосов
/ 04 августа 2009

Я сделал это и увидел, что это сделано без особых проблем.

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

  • project / src <- .cc и .h файлы </li>
  • project / src / linux | win <- код, специфичный для одной или другой платформы </li>
  • project / linux <- создавать файлы и другие связанные с проектом вещи </li>
  • project / win <- .sln и .csproj файлы </li>

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

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

5 голосов
/ 05 августа 2009

, как упоминалось в предыдущих статьях, Qt - это очень простой метод для одновременной реальной мультиплатформенной разработки - независимо от вашей IDE и со многими различными компиляторами (даже для Symbian, ARM, Windows CE / Mobile ...).

В моей прошлой и нынешней компании я работаю в смешанных командах разработчиков Linux и Windows, которые работают вместе, используя Subversion и Qt (которая имеет очень простую и мощную систему сборки "QMake", которая скрывает все различные платформы / специфичные для компилятора среды сборки - вам просто нужно написать один файл сборки для всех платформ - так просто!).

И: Qt содержит почти все, что вам нужно:

  • простая обработка строк, с простой поддержкой перевода и простым преобразованием строк (utf8, utf16, asci ...)
  • простые классы для ввода / вывода файлов, изображений, работы в сети и т. Д.
  • удобные занятия по ГИ
  • графический дизайнер для макета / дизайна графического интерфейса
  • графический инструмент перевода для создания динамических переводов для ваших приложений (вы можете запустить один двоичный файл с различными выбираемыми языками - даже кириллицей, азиатскими шрифтами ...)
  • интегрированная среда тестирования (модульные тесты)

Итак, Qt - это полнофункциональная и очень надежная среда - я использую ее 10 лет.

И: Qt легко интегрируется в IDE, такие как VC ++, Eclipse, или предоставляет собственную IDE "QtCreator".

см .: http://www.trolltech.com + http://doc.trolltech.com

С наилучшими пожеланиями, Chris

4 голосов
/ 04 августа 2009

У меня был такой опыт работы в Acronis. У нас была та же кодовая база, которая использовалась для создания бинарных файлов (фактически, полностью упакованных инсталляторов), предназначенных для Win32 / 64, Linux и OS X (и множества других более экзотических платформ, таких как EFI), причем каждый работал в своей IDE по своему выбору. Хитрость заключается в том, чтобы избежать решений, специфичных для компиляторов и IDE, и сделать ваш проект полностью готовым из чистых кросс-платформенных файлов сборки. Обратите внимание, что вы можете прекрасно использовать любую систему make вместе с VC ++, так что это не проблема (мы использовали Watcom make по историческим причинам, но я бы не рекомендовал это).

Еще один трюк, который вы можете сделать, это добавить скрипт make, который автоматически создает файлы проекта из списков ввода в ваших make-файлах, для всех IDE, которые вы используете (например, VS и Eclipse CDT). Таким образом, каждый разработчик создает этот материал для себя, а затем открывает эти проекты в IDE для редактирования / сборки / отладки, но в исходном репозитории есть только make-файлы.

Обеспечение возможности компиляции кода для всех может быть проблемой, в основном потому, что VC ++, как правило, более слабо применяет правила, чем g ++ (например, это позволит вам связать значение r с неконстантной ссылкой, хотя и с предупреждением ). Если вы компилируете предупреждения как ошибки и наивысшие уровни предупреждений (возможно, отключено несколько отобранных предупреждений), вы в основном избежите этого. Создание непрерывной непрерывной сборки - еще один способ поймать их на ранней стадии. Еще один подход, который мы использовали в Acronis, заключается в том, чтобы в среде сборки Windows были инструменты кросс-компиляции на основе Cygwin, чтобы любой разработчик Windows мог сделать сборку, ориентированную на Linux (с той же версией g ++ и всеми), из своего устройства, и посмотрите, не получится ли это, чтобы убедиться, что его изменения скомпилированы в g ++.

3 голосов
/ 05 августа 2009

Я опоздал на этот вопрос, и здесь есть много хороших ответов, но я не видел, чтобы кто-нибудь перечислял все проблемы, с которыми я сталкивался (большая часть моей работы в C ++ есть и была перекрестной платформа), а значит:

  • Кроссплатформенная компиляция. Все достаточно хорошо это осветили. CMake и SCons полезны среди других.
  • Различия платформ. На самом деле они не ограничиваются Linux v Windows. Различные версии Windows имеют множество тонких проблем. Если вы когда-нибудь захотите перейти с Linux на OS X, вы найдете то же самое. Так же как и различия в архитектуре процессора: 32 на 64 бита, как правило, не имеют значения - до тех пор, пока это не произойдет, и все будет очень плохо. Это то, с чем сталкиваются программисты на C ++ больше, чем в большинстве других языков, реализации которых прилагают все усилия, чтобы скрыть подобные вещи от программистов.
  • Проверьте все . Алан упоминает юнит-тесты , но позвольте мне подчеркнуть их. Настоящая проблема кросс-платформенного программирования - это не код, который не будет компилироваться: это код, который прекрасно компилируется и делает неправильные вещи в тонких случаях. Модульные тесты имеют здесь гораздо большее значение, чем когда вы работаете на одной платформе.
  • По возможности используйте переносимые библиотеки. Получение этого права полно тонких ошибок. Лучше воспользоваться чужой работой, чем накатить свою. Qt здесь полезен, как и NSPR и APR (последние два - C, но оболочки существуют, если вы не хотите связываться с ними напрямую. ) Это библиотеки, которые нацелены на абстракцию платформы в качестве цели, но большинство других библиотек, которые вы используете, должны быть проверены на это. Будьте осторожны с классными библиотеками, у которых нет репутации в области переносимости. Я не говорю, что не используйте их: просто протестируйте сначала. Если вы сделаете это правильно, вы сэкономите огромные усилия на тестировании.
  • Павел упоминает непрерывную интеграцию . Это может не иметь значения, если есть только несколько из вас. Но я обнаружил, что количество платформ, которые вы получаете, учитывая все различия ОС, вариантов ОС и процессоров, означает, что без какой-либо формы непрерывного цикла сборки-тестирования у вас всегда будет отсутствовать какой-то крайний случай. Если ваш проект становится больше, чем горстка людей, подумайте об этом.
  • Контроль версий. Наиболее очевидная проблема заключается в обработке новых строк и чувствительности к регистру имени файла, но есть и другие. Большинство известных VCS с открытым исходным кодом делают это прямо сейчас, но примечательно, что им обычно требуется несколько лет, чтобы найти все их ошибки, связанные с переносимостью. В качестве примера, Mercurial, переносимость которого была одной из его точек продаж, содержит ряд исправлений, охватывающих три или четыре выпуска, посвященных именам Windows в необычных ситуациях. Убедитесь, что вы можете проверить, что другие проверяют рано.
  • Scripts. Используйте Perl / Python / Ruby (или что-то подобное) для ваших сценариев. Попытки синхронизировать оболочку Linux и пакетные скрипты Windows мучительно утомительны.

Несмотря на все вышесказанное: кроссплатформенность в целом вполне выполнима, и нет реальной причины избегать этого. Мой опыт показывает, что проблемы, как правило, возникают спорадически, но когда они это делают, они отнимают больше времени. Если вы программировали какое-то время, вы не найдете в этом ничего необычного.

3 голосов
/ 05 августа 2009

Мы также работаем над кроссплатформенным проектом. Мы используем Emacs для кодирования, SCons для сборки и Visual Studio 2008 для отладки. Я впервые использую Emacs + SCons, и я должен сказать, что это очень очень изящно, когда вы выясните, как работают SConstruct и SConscripts.

3 голосов
/ 04 августа 2009

Я лично использую cmake / mingw32 / Qt4 для всех своих потребностей в C ++. QtCreator - это кроссплатформенная IDE, которая несколько оптимизирована для программирования на qt4.

2 голосов
/ 05 августа 2009

Еще один голос за cmake.
Единственное, на что следует обратить внимание, имена файлов пишутся в регистре, но не чувствительны к регистру в Windows. Они чувствительны к регистру в большинстве файловых систем Unix.

Обычно это проблема с #include

например. предоставлен файл FooBar.h

 #include "foobar.h" // works on Windows, fails on Linux.
2 голосов
/ 04 августа 2009

Я сделал это двумя способами:

  1. Каждая платформа имеет свою собственную систему сборки. Всякий раз, когда кто-то что-то изменяет (добавляя исходный файл), он либо адаптирует другую платформу, либо отправляет уведомление по почте, а кто-то, более знакомый с другой платформой, соответствующим образом адаптирует его.
  2. Использовать CMake .

Не могу сказать, что мне очень понравился CMake, но кроссплатформенный инструмент, безусловно, имеет свои преимущества.

Как правило, использование разных компиляторов для компиляции кода из самых первых строк - это всегда хорошая идея, поскольку это помогает улучшить качество кода.

2 голосов
/ 04 августа 2009

Это возможно (я делаю это, чтобы заработать свои ежедневные деньги :-)).

Но вы должны иметь в виду различия в поставляемых ОС библиотеках, которые могут быть очень раздражающими. Два хороших способа обойти это BOOST и QT.

Оба предоставляют вам независимые от платформы функции полезных вещей, которые не обрабатываются C lib и STL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...