C ++ Исполняемая стратегия распространения - PullRequest
3 голосов
/ 14 сентября 2009

Недавно я задал вопрос о том, что я должен использовать для создания автономных исполняемых файлов, которые будут развернуты в ряде дистрибутивов Linux . Сначала я очень испугался, но после прочтения немного о C ++ мне удалось запустить первую версию моего исполняемого файла.

После дня, полного радости, я снова ударился о стену еще одной дилеммой. Получившийся исполняемый файл должен быть установлен в нескольких дистрибутивах Linux (Slackware, Arch, Ubuntu, Debian, CentOS и некоторых других), и я совершенно не знаю, как этого добиться. Все, что я знаю, в ОС CentOS и Debian есть менеджеры пакетов, такие как apt или yum, но я не уверен, что они применимы к моему случаю.

Код, который я написал, зависит от нескольких библиотек (более конкретно RudeSocket и yaml-cpp . Мне сказали, что я смогу скомпилировать исполняемый файл и связать его динамически, поэтому мне просто нужно было распространить исполняемый файл.

Бывает, что я не смог найти файл .a для библиотеки yaml-cpp (только для RudeSocket). И вот моя проблема до сих пор:

Сначала я использовал динамическое связывание, но (очевидно), когда скопировал исполняемый файл в другое окно:

$ ./main
./main: error while loading shared libraries: libyaml-cpp.so.0.2: cannot open shared object file: No such file or directory

При попытке статической компиляции я тоже получаю сообщение об ошибке (поскольку у меня нет файла yaml-cpp .a, как я уже упоминал):

$ g++ main.cpp parse.cpp parse.h rudesocket-1.3.0/.libs/librudesocket.a -o main -static -L/usr/local/librudesocket-1.3.0/.libs/librudesocket.a(socket_connect_normal.o): In function `rude::sckt::Socket_Connect_Normal::simpleConnect(int&, char const*, int)':
/root/webbyget/sockets/rudesocket-1.3.0/src/socket_connect_normal.cpp:250: warning: Using 'gethostbyname' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/tmp/cc3cEVK1.o: In function `operator>>(YAML::Node const&, Job&)':
parse.cpp:(.text+0x1a83): undefined reference to `YAML::Node::size() const'
/tmp/cc3cEVK1.o: In function `handle_job(rude::Socket, char const*)':
parse.cpp:(.text+0x1b79): undefined reference to `YAML::Parser::Parser(std::basic_istream<char, std::char_traits<char> >&)'
parse.cpp:(.text+0x1bfd): undefined reference to `YAML::Node::Node()'
parse.cpp:(.text+0x1c10): undefined reference to `YAML::Parser::GetNextDocument(YAML::Node&)'
parse.cpp:(.text+0x1dc6): undefined reference to `YAML::Node::size() const'
parse.cpp:(.text+0x1dee): undefined reference to `YAML::Node::~Node()'
parse.cpp:(.text+0x1e18): undefined reference to `YAML::Node::~Node()'
parse.cpp:(.text+0x1e37): undefined reference to `YAML::Parser::~Parser()'
parse.cpp:(.text+0x1e61): undefined reference to `YAML::Parser::~Parser()'
(...)

Для меня совершенно очевидно, что g ++ не может скомпилировать его статически, не указав, где найти классы для yaml-cpp.

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

Так что мой вопрос действительно двойной:

  • как я могу распространять эту скомпилированную программу наименее сложным способом для всех этих дистрибутивов?

  • Есть ли де-факто стандартное решение для такого рода проблем?

Заранее спасибо,

Фелипе.

Ответы [ 4 ]

4 голосов
/ 16 сентября 2009

Вы можете попробовать эту технику попробовать.

0 голосов
/ 23 сентября 2009

Возможно, лучшее решение для вас - использовать CMake .

CMake - это кроссплатформенная система с открытым исходным кодом. Это семейство инструментов, предназначенных для создания, тестирования и упаковки программного обеспечения. Для упаковки, Mgb - это правильно, CMake можно легко соединить с CPack .

KDE использует это решение и является очень хорошей альтернативой automake / autoconf.

0 голосов
/ 16 сентября 2009

Если вы используете менеджер пакетов платформ (.rpm или .deb), система проверит правильную версию разделяемой библиотеки и загрузит ее, если это необходимо.

CPack , вероятно, самый простой генератор пакетов

0 голосов
/ 14 сентября 2009

Существует много стандартов де-факто, но ни один из них не стандартизирован. :( Если вы хотите распространять скомпилированный бинарный файл, вы, вероятно, захотите создать пакет для каждой платформы, на которую хотите нацелиться. Генерация rpm и deb, вероятно, даст вам 90% пути. Если вы хотите автоматизировать сборку процесс, autoconf / automake все еще (вероятно) лучший путь.

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