Сборка C ++ на Windows и Linux - PullRequest
       61

Сборка C ++ на Windows и Linux

10 голосов
/ 10 июля 2009

Я участвую в проекте C ++ для платформ Windows и Linux (RHEL). До сих пор разработка велась исключительно на Visual Studio 2008. Для компиляции Linux мы использовали сторонний плагин Visual Studio, который считывает файлы с решениями VS / perojects и удаленно компилируется на компьютере с Linux.

Недавно было принято решение отказаться от стороннего плагина.

Теперь моя большая проблема - система сборки. Я искал кроссплатформенные инструменты для сборки. Таким образом, мне не нужно поддерживать два набора файлов сборки (например, vcproj / solution для Windows и make files для Linux).

Я нашел следующих кандидатов: а. Scons б. CMake

Что вы думаете об инструментах кросс-платформенной разработки?

Еще один момент, который меня беспокоит, это то, что Visual Studio (+ Visual Assist) потеряет много функциональности без файлов vcproj - как вы справитесь с этой проблемой с помощью инструментов?

Спасибо Дима

PS 1: Что мне нравится в Scons, так это то, что (а) использует python и, следовательно, он гибок, в то время как cmake использует собственный язык (я понимаю, что он не является функцией-победителем для системы сборки) (b) самодостаточен (не нужно создавать make-файлы в Linux, как в cmake).

Так почему не Scons? Почему в ваших проектах было принято решение использовать cmake?

Ответы [ 6 ]

10 голосов
/ 10 июля 2009

CMake позволит вам по-прежнему использовать решения Visual Studio и файлы проектов. Cmake не собирает сам исходный код, а генерирует файлы сборки для вас. Для Linux это может быть Code :: Blocks, KDevelop или обычные make-файлы или другие более эзотерические варианты. Для Windows это могут быть файлы проекта Visual Studio и другие для MacOS. Таким образом, решения и проекты Visual Studio создаются из вашего CMakeLists.txt. Это работает для больших проектов просто отлично. Например. В настоящее время Ogre3d использует CMake для всех платформ (Windows, Linux, MacOS и IPhone), и он работает очень хорошо.

Я не знаю много о scons в этом отношении, хотя, я использовал только для создания одной библиотеки и только в Linux. Поэтому я не могу сравнить эти два на справедливой основе. Но для наших мультиплатформенных проектов CMake достаточно силен.

3 голосов
/ 10 июля 2009

Еще один вариант - premake. Это похоже на cmake в том, что оно генерирует решения из файлов определений. Это открытый исходный код, и последняя версия очень настраиваема с использованием сценариев Lua. Мы смогли добавить поддержку пользовательских платформ без особых проблем. Для вашей ситуации он поддерживает стандарт Visualfile и GNU makefiles.

См. Домашняя страница Premake 4.0

CruiseControl - хороший выбор для непрерывной интеграции. У нас он работает на Linux с использованием Mono с успехом.

3 голосов
/ 10 июля 2009

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

Мы считаем, что это хорошо работает для наших нужд, каждая библиотека или приложение разрабатывается либо на Linux, либо на Windows с учетом кросс-компиляции (например, не используйте API для конкретной платформы). Мы используем boost для таких вещей, как пути к файлам, потоки и так далее. В определенных случаях мы используем шаблоны / # define, чтобы выбрать решение для конкретной платформы (например, события). Когда все будет готово, мы переходим на другую систему (Linux или Windows), перекомпилируем, исправляем предупреждения / ошибки и тестируем.

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

У нас есть приложения с графическим интерфейсом только в Windows atm. поэтому нет графического интерфейса для кросс-компиляции. Большая часть нашей разработки, которая совместно используется Windows и Linux, связана с сетями на стороне сервера (сокеты, TCP / IP, UDP ...), а затем с инструментами на стороне клиента в приложениях Linux и GUI в Windows.

Используя во время выполнения для управления версиями исходного кода, во многих случаях мы обнаруживаем, что система Linux Makefile гораздо более гибкая для того, что нам нужно, чем Windows VS. Особенно для использования нескольких рабочих пространств (представлений версий исходного кода), где нам нужно указывать на общие каталоги и так далее. В Linux это можно сделать автоматически, запустив сценарий для обновления переменных среды, в Visual Studio ссылки на переменные среды очень негибки, поскольку трудно автоматически обновлять представления / ветви.

Вопрос повторной синхронизации:

Я предполагаю, что вы спрашиваете, как убедиться, что две системы сборки синхронизируются между Linux и Windows. На самом деле мы используем Hudson в Linux и CruiseControl в Windows (у нас сначала были окна с круиз-контролем, когда я перешел на установку версии linux, я подумал, что Hudson лучше, так что теперь у нас смешанная среда). Наши системы работают постоянно. Когда что-то обновляется, оно тестируется и выпускается (либо версия для Windows, либо для Linux), чтобы вы сразу знали, если это не работает. Во время тестирования мы удостоверимся, что все последние функции доступны и полностью функциональны. Полагаю, ничего страшного в этом нет.

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

Помогает согласованно настраивать проекты.

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

3 голосов
/ 10 июля 2009

Я раньше не использовал Scons, поэтому не могу сказать, как это работает, но CMake работает довольно хорошо.

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

При использовании для таргетинга на VC ++ он создает файлы решений и проектов, поэтому из VS создается впечатление, что они являются собственными проектами VS. Разница лишь в том, что если вы отредактируете проект или решение напрямую через VS, изменения будут стерты при следующем запуске CMake, так как он перезаписывает файлы вашего проекта / решения.

Таким образом, любые изменения должны быть сделаны в файлах CMake.

1 голос
/ 10 июля 2009

Вот статья о решении разработчиков KDE выбрать CMake вместо SCons. Однако я должен отметить, что этой статье уже почти три года, поэтому сыновья должны были улучшиться.

Здесь - сравнение SCons с другими строительными инструментами.

0 голосов
/ 10 июля 2009

Пришлось много делать в прошлом. Мы использовали gnu make практически для всего, включая windows.

Вы можете использовать файлы проекта в Windows, если предпочитаете, и использовать gnu make для Linux.

На самом деле нет хорошего способа написать кросс-платформенные make-файлы, потому что целевой файл отличаться от других вещей (и проблем с именами путей, \ vs / etc). В общем, вы, вероятно, будете настраивать код на разных платформах, чтобы учесть тонкие различия, поэтому придется выполнить настройку файла make и проверку на других платформах. в любом случае.

Многие проекты ОС поддерживают Make-файлы для разных платформ, таких как zlib, где они называются как Makefile.win, Makefile.linux и т. Д.

...