最近我问了一个问题,我应该对create self-contained executables that would be deployed under a number of Linux distribution使用什么。起初我很害怕,但是在稍微了解一下C++之后,我设法获得了可执行文件的第一个版本。

在充满欢乐的一天之后,我又遇到了另一个难题。生成的可执行文件必须安装在许多Linux发行版(Slackware,Arch,Ubuntu,Debian,CentOS等)中,而我对如何实现它一无所知。我所知道的所有基于CentOS和基于Debian的OS都有软件包管理器,例如apt或yum,但是我不确定这些软件包是否适用于我的情况。

我编写的代码取决于几个库(更具体地说是RudeSocketyaml-cpp。有人告诉我,我可以编译可执行文件并动态链接它,因此只需要分发可执行文件即可。

碰巧我找不到yaml-cpp库的.a文件(仅适用于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的类。

非常重要的一点是,安装应该在没有人工干预的情况下以自动化方式进行。

所以我的问题确实是双重的:
  • 如何以最简单的方式针对所有这些发行版分发此编译程序?
  • 是否存在针对此类问题的事实上的标准解决方案?

  • 先感谢您,

    费利佩。

    最佳答案

    您可以尝试this technique

    关于c++ - C++可执行分发策略,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1418965/

    10-10 23:00