При разработке приложений на C ++ целевой сервер имеет разные версии std lib, каковы лучшие практики - PullRequest
2 голосов
/ 12 апреля 2019

Узкая версия вопроса: проблема в том, что я разрабатываю приложения на C ++, работаю на ноутбуке (Fedora 29) с GNU libc 2.28, GCC версии 8.3 и моим целевым сервером (RHEL 6.5) это GNU libc 2.12, версия GCC 4.47. Серверы находятся в разных сетях, чем моя среда разработки, из-за проблем с регулированием, поэтому для перемещения файлов между ноутбуком и серверами требуется использование флэш-накопителя и их перемещение вручную.

Если я скомпилировал бинарный файл на своем ноутбуке и развернул его на сервере, я получу ошибки, связанные с различными версиями glibc. Я уверен, что проблем будет больше, поскольку ОС настолько разные, поэтому я просто пишу код на своем ноутбуке, проверяю его компиляцию, а затем компилирую на одном из серверов и распространяю. Все в порядке. Но одна из проблем заключается в том, что некоторые функции c++11 доступны на моем ноутбуке при компиляции c++0x, но недоступны на сервере, поэтому мне нужно исправить код на сервере, чтобы убедиться, что он компилируется, а затем передать обратно на мой ноутбук, чтобы я мог обновить исходный код. Это очень утомительно.

Я бы хотел довести его до такой степени, чтобы я мог просто скомпилировать двоичные файлы на своем ноутбуке и передать двоичные файлы на серверы или, если это не удалось, просто установить на своем ноутбуке вторую цепочку инструментов, которая отражает то, что включено. сервер. Я собрал RPM-файлы для glibc, gcc, stdlibc ++, gcc-c ++ и нескольких других библиотек, чтобы соответствовать тому, что находится на сервере.

Расширенная версия: Каковы оптимальные методы разработки для целевых систем на C ++ с различными версиями std lib? Это просто установка виртуальной машины целевой системы и выполнение всей моей работы там? Или я могу получить достаточно близко, устанавливая те же самые версии библиотеки рядом? Кажется, что большинство людей уже знают этот материал, и у меня может быть огромный пробел в моих знаниях, есть ли какой-нибудь сжатый справочный материал, на который я мог бы указать, если это так?

1 Ответ

0 голосов
/ 16 апреля 2019

На основании обсуждения в комментариях, есть 3 основных варианта.

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

DOCKER (контейнеры); Самый простой способ, просто создать контейнер, соответствующий вашему серверу развертывания, скомпилировать код в контейнере, и затем двоичные файлы могут быть развернуты на сервере. Однако Docker использует ядро ​​хост-машин в контейнере, поэтому существует вероятность создания несовместимых двоичных файлов.

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

Я закончил с Docker, он работал нормально и был очень прост в настройке.

...