Недавно я задал вопрос о том, что я должен использовать для создания автономных исполняемых файлов, которые будут развернуты в ряде дистрибутивов 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.
Очень важно, чтобы установка происходила без участия человека, в автоматическом режиме.
Так что мой вопрос действительно двойной:
Заранее спасибо,
Фелипе.