Советы о том, как развернуть код C ++ для работы везде - PullRequest
18 голосов
/ 21 марта 2010

Я не говорю о создании переносимого кода. Это больше вопрос распространения. У меня есть проект среднего размера. Он имеет несколько зависимостей от общих библиотек (например, openssl, zlib и т. Д.). Он прекрасно скомпилируется на моей машине, и теперь пришло время отдать его миру.

По сути, постройка инженерных систем во всей красе. Я хочу сделать установщики для Windows, Linux, MacOSX и т. Д. Я хочу создать загружаемый tar-шар, который будет работать с кодом ./configure и make (возможно, через autoconf). Было бы здорово иметь опцию make, которая собирала бы инсталляторы ... может быть даже кросс-компилировать, чтобы инсталлятор Windows мог быть встроен в Linux.

Какова лучшая стратегия? Где я могу ожидать провести больше всего времени? Должен ли основной фокус быть автоконф или есть другие инструменты, которые могут помочь?

Ответы [ 3 ]

18 голосов
/ 21 марта 2010

Я бы порекомендовал CMake . Преимущества:

  • Его очень легко использовать для создания простых и сложных проектов со статическими библиотеками, динамическими библиотеками, исполняемыми файлами и их зависимостями.
  • Он не зависит от платформы и генерирует make-файлы и / или файлы проекта ide для большинства компиляторов и IDE.
  • Он абстрагирует различия между windows и unix, например, «libShared.so» и «Shared.dll» называются «Shared» (cmake обрабатывает различия имен для каждой платформы), если Shared является частью вашего проекта, он сортирует зависимость, если не предполагает, что она находится в пути компоновщика.
  • Он исследует пользовательскую систему на предмет наличия необходимых компиляторов и сторонних библиотек. Затем можно при желании удалить компоненты, когда сторонние библиотеки недоступны, или отобразить сообщение об ошибке (поставляется с макросами для поиска наиболее распространенных сторонних библиотек).
  • Его можно запустить из командной строки или с помощью простого графического интерфейса, который позволяет пользователю изменять любые параметры, обнаруженные выше (например, компилятор или версию сторонней библиотеки).
  • Поддерживает макросы для автоматизации общих шагов.
  • Существует компонент CPack, который позволяет вам создавать установщик, я думаю, что это просто make install командная строка (я не использовал его).
  • Компонент CTest интегрируется с другими библиотеками модульного тестирования, такими как boost test или google test.

Сейчас я использую CMake для всего, даже для простых тестовых проектов с Visual Studio.

Я никогда не использовал autotools, но многие другие пользователи отмечали, что cmake проще в использовании. По этой причине проект KDE перенесен в cmake из автоинструментов.

3 голосов
/ 21 марта 2010

Продукт, над которым я работаю, не слишком отличается от этого. Мы используем систему сборки на основе autoconf, и она работает довольно хорошо.

Место, которое вы потратите больше всего времени, это поддержка пользователей. Пользовательские системы будут иметь разного рода морщины, которых вы не ожидаете, пока не столкнетесь с ними, и вам потребуется добавить дополнительные параметры конфигурации для их поддержки. Со временем мы добавили опции для установки путей include и lib для каждой библиотеки, от которой мы зависим; мы добавили опции для изменения флагов компиляции, чтобы обходить различные странные сбои в различных версиях этих библиотек (или переходы API от одной версии к другой, которые требуют изменений в нашем коде), мы добавили обходные пути для того факта, что некоторые библиотеки BLAS использовать интерфейс C, а некоторые - интерфейс Fortran, поэтому, хотя они теоретически являются реализациями одной и той же библиотеки, они делают некоторые вещи немного по-другому и так далее. Вы не можете ожидать всего этого заранее, и это также требует документирования, чтобы пользователи могли выяснить, какие параметры устанавливать.

Да, и установщики действительно являются проблемой, потому что они, как правило, зависят от ОС (если это не просто сценарий оболочки, и вам не нужен CygWin), и места для установки, как правило, зависят от ОС, и так далее. Это еще одна область, которая займет время - либо в создании хорошего установщика, либо в поддержке пользователей в настройке вручную.

Настройка кросс-компиляции, по моему опыту, стоит потраченных усилий (по крайней мере, в случае Linux-to-Windows; не уверен в MacOS / X) - гораздо проще, чем пытаться сохранить несколько разных систем сборки в синхронизации.

В качестве альтернативы, есть вариант, который проект OpenFOAM использует для своей довольно большой библиотеки C ++, которая заключается в том, чтобы распространять ее вместе с «одобренным» компилятором G ++ и пакетами для всех других компонентов, чтобы они не надо беспокоиться о разных компиляторах и тому подобное. Но это действительно работает только на одной ОС. Я предполагаю, что версия для Windows / MacOSX предназначена для предустановленных образов VMWare. В некоторых случаях для этого есть что сказать ....

0 голосов
/ 21 марта 2010

Используйте автоинструменты, большинство пользователей знакомы с ними (т.е. они знают, что нужно запускать ./configure && make && make install)

  • Создайте .tar.gz с make dist, проверьте, что он компилируется и работает более чем на одной системе.
  • Для Linux / Unix / Cygwin не предоставляйте инсталляторов ... source tar.gz более чем приемлем. В любом случае у каждого дистрибутива Linux есть свои собственные правила упаковки, и большинство из них знают, что нужно использовать сборки autoconf, пользователи могут иметь 32- или 64-битные системы или даже работать на PPC или Sparc - так что не беспокойтесь.

    Возможно, стоит создать один deb или rpm для большинства популярных систем, но не более того ...

  • Для Windows (родной, а не Cygwin) предусмотрены двоичные файлы. Установка Migw + auto довольно болезненна, и пользователи Windows, как правило, больше «пользователи, следующие, следующие, затем пользователи», чем wget / tar / configure / make / make-install «пользователи». Укажите zip или какой-либо инсталлятор. там.

    Помните, что у бедных пользователей Windows по умолчанию нет zlib или openssl ... Поэтому вам нужно будет поставлять их вместе с вашим пакетом.

О CMake ...

Если вы ориентируетесь в основном на платформу Windows или хотите поддерживать MSVC, то, вероятно, вам следует это рассмотреть. В противном случае, autotools обеспечивает хорошее распространение и альтернативу сборки.

...