Одновременная разработка C++ на Linux и Windows

остерегайтесь JavaScript определенного определения пустого указателя. существует два определения для "никакого значения" в JavaScript. 1. Пустой указатель: когда переменная является пустой, это означает, что это не содержит данных в нем, но переменная уже определяется в коде. как это:

var myEmptyValue = 1;
myEmptyValue = null;
if ( myEmptyValue === null ) { window.alert('it is null'); }
// alerts

в таком случае, типом Вашей переменной является на самом деле Объект. протестируйте его.

window.alert(typeof myEmptyValue); // prints Object
  1. Неопределенный: когда переменная не была определена, прежде в коде, и как ожидалось, она не содержит значения. как это:

    if ( myUndefinedValue === undefined ) { window.alert('it is undefined'); }
    // alerts
    

, если такой случай, тип Вашей переменной 'не определен'.

уведомление, что при использовании преобразовывающего тип оператора сравнения (==) JavaScript будет действовать одинаково обоих из этих пустых значений. для различения их всегда используйте строгий типом оператор сравнения (===).

12
задан Nack 4 August 2009 в 19:28
поделиться

12 ответов

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

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

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

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

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

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

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

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

Кроме того,

12
ответ дан 2 December 2019 в 03:03
поделиться

Как упоминалось в предыдущих сообщениях, 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

С уважением,)

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

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

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

    С уважением,)

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

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

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

    С уважением, Крис

    5
    ответ дан 2 December 2019 в 03:03
    поделиться

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

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

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

    4
    ответ дан 2 December 2019 в 03:03
    поделиться

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

    3
    ответ дан 2 December 2019 в 03:03
    поделиться

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

    3
    ответ дан 2 December 2019 в 03:03
    поделиться

    Проблема не в редактировании исходных файлов C ++, а в самом процессе сборки. VS не использует ту же архитектуру Makefile, что обычно используется при разработке Linux. Радикальное предложение, но обе группы могут фактически использовать одну и ту же C ++ IDE и процесс сборки - см. Code :: Blocks для получения дополнительной информации.

    2
    ответ дан 2 December 2019 в 03:03
    поделиться

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

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

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

    2
    ответ дан 2 December 2019 в 03:03
    поделиться

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

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

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

    В качестве примера Mercurial, одним из аргументов в пользу которого является переносимость, имеет ряд исправлений, охватывающих три или четыре выпуска, касающихся имен файлов Windows в необычных ситуациях. Убедитесь, что вы можете заранее проверить, что другие проверяют.
  • Скрипты. Используйте Perl / Python / Ruby (или что-то в этом роде) для своих сценариев. Пытаться поддерживать синхронизацию оболочки Linux и пакетных сценариев Windows до боли утомительно.
  • Несмотря на все вышесказанное: в целом кроссплатформенность вполне выполнима, и нет реальной причины избегать этого. Мой опыт показывает, что проблемы, как правило, возникают спорадически, но когда они возникают, они отнимают больше времени, чем есть. Если вы уже какое-то время занимаетесь программированием, вы не найдете в этом ничего необычного.

    В качестве примера Mercurial, одним из аргументов в пользу которого является переносимость, имеет ряд исправлений, охватывающих три или четыре выпуска, касающихся имен файлов Windows в необычных ситуациях. Убедитесь, что вы можете заранее проверить, что другие проверяют.
  • Скрипты. Используйте Perl / Python / Ruby (или что-то подобное) для своих сценариев. Пытаться поддерживать синхронизацию оболочки Linux и пакетных сценариев Windows до боли утомительно.
  • Несмотря на все вышесказанное: в целом кроссплатформенность вполне выполнима, и нет реальной причины избегать этого. Мой опыт показывает, что проблемы, как правило, возникают спорадически, но когда они возникают, они отнимают больше времени, чем есть. Если вы уже какое-то время занимаетесь программированием, вы не найдете в этом ничего необычного.

    содержит ряд исправлений, охватывающих три или четыре выпуска, касающихся имен файлов Windows в нестандартных ситуациях. Убедитесь, что вы можете проверить, что другие проверяют на раннем этапе.
  • Скрипты. Используйте Perl / Python / Ruby (или что-то в этом роде) для своих сценариев. Пытаться сохранить синхронизацию оболочки Linux и пакетных сценариев Windows до боли утомительно.
  • Несмотря на все вышесказанное: в целом кроссплатформенность вполне выполнима, и нет реальной причины избегать этого. Мой опыт показывает, что проблемы, как правило, возникают спорадически, но когда они возникают, они отнимают больше времени, чем есть. Если вы уже какое-то время занимаетесь программированием, вы не найдете в этом ничего необычного.

    содержит ряд исправлений, охватывающих три или четыре выпуска, касающихся имен файлов Windows в необычных ситуациях. Убедитесь, что вы можете заранее проверить, что другие проверяют.
  • Скрипты. Используйте Perl / Python / Ruby (или что-то в этом роде) для своих сценариев. Пытаться сохранить синхронизацию оболочки Linux и пакетных сценариев Windows до боли утомительно.
  • Несмотря на все вышесказанное: в целом кроссплатформенность вполне выполнима, и нет реальной причины избегать этого. Мой опыт показывает, что проблемы, как правило, возникают спорадически, но когда они возникают, они отнимают больше времени, чем есть. Если вы уже какое-то время занимаетесь программированием, вы не найдете в этом ничего необычного.

    Используйте Perl / Python / Ruby (или что-то подобное) для своих сценариев. Пытаться поддерживать синхронизацию оболочки Linux и пакетных сценариев Windows до боли утомительно.

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

    Используйте Perl / Python / Ruby (или что-то подобное) для своих сценариев. Пытаться поддерживать синхронизацию оболочки Linux и пакетных сценариев Windows до боли утомительно.

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

    3
    ответ дан 2 December 2019 в 03:03
    поделиться

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

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

    , например. учитывая файл FooBar.h

     #include "foobar.h" // works on Windows, fails on Linux.
    
    2
    ответ дан 2 December 2019 в 03:03
    поделиться

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

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

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

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

    2
    ответ дан 2 December 2019 в 03:03
    поделиться

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

    Еще я бы посоветовал использовать eclipse CDT в качестве среды разработки. Он работает в любом месте, где вы можете запускать Java и gcc, и это объединяет вашу среду разработки.

    Я думаю, что именно Алан Джексон сделал упор на модульное тестирование. Для этого вам понадобятся библиотеки кросс-платформенных модульных тестов. Я прочитал это сообщение время назад о средах модульного тестирования C ++. Это немного устарело, но продуманно. Отсутствует тот, который также работает на обеих платформах, - это googletest .

    Наконец, если вы хотите запускать этот тест автоматически на обеих платформах, у cmake есть еще один инструмент под названием ctest, который очень хорош для этого.

    1
    ответ дан 2 December 2019 в 03:03
    поделиться
    Другие вопросы по тегам:

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