【问题标题】:How do people distrubute boost programs which have binary dependencies on boost modules?人们如何分发对 boost 模块具有二进制依赖关系的 boost 程序?
【发布时间】:2014-05-04 19:38:59
【问题描述】:

我有一个使用boost::asio 的非常基本的客户端/服务器项目。它生成两个可执行文件,一个客户端和一个服务器。

当我运行客户端时,我得到以下信息:

./client: error while loading shared libraries: 
libboost_system.so.1.55.0: cannot open shared object 
file: No such file or directory

这意味着程序需要在运行时动态加载boost_system 二进制文件。这是有道理的,因为boost_asio 的一个依赖项是boost_system

这对于将我的应用程序轻松分发给最终用户意味着什么

1) 我是否只是在我的系统上弹出我的开发版本的boost_system 二进制文件,在这种情况下是libboost_system.so.1.55.0?我如何确保当用户运行客户端时,它会找到动态存档?显然,在我的系统上,即使我安装了 boost,它仍然找不到存档。

2) 我在 Linux 上构建,因此我有 .so 二进制文件。如果我尝试使用 mingw-w64 交叉编译适用于 Windows 的应用程序,#1 将如何变化?

我是分发 C++ 程序和使用动态/共享库的新手。

当我静态编译时,我收到以下警告:

Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking

【问题讨论】:

  • 您可以使用静态库版本(.a)来避免外部依赖。也许你必须用一些参数重新编译 boost 才能得到它们。
  • 当我静态链接时,我得到Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
  • 这是 ant 生成的:g++ -fexceptions -pthread -std=c++11 -o build/debug/client /eclipse/cppplay/build/debug/obj/client/Client.o -static -I/usr/local/bin/boost -L/usr/local/bin/boost/lib -lboost_system -g
  • 也许this 可以帮助你。我以前从未遇到过这个警告。
  • 我已经看到了这个问题。不幸的是,帖子中没有很好的答案。

标签: c++ boost


【解决方案1】:

建议:

1) 如果您使用共享库,您肯定需要在可执行文件中包含您的程序实际单独使用的那些库。

2) 这是 Boost 库的列表。您的程序只需要一个子集:

http://www.boost.org/doc/libs/1_49_0/more/getting_started/unix-variants.html

唯一必须单独构建的 Boost 库是:

  • Boost.文件系统
  • Boost.GraphParallel
  • Boost.IOStreams
  • Boost.MPI
  • Boost.ProgramOptions
  • Boost.Python(在构建和安装之前请参阅 Boost.Python 构建文档)
  • Boost.Regex
  • Boost.序列化
  • Boost.Signals
  • Boost.System
  • Boost.Thread
  • Boost.Wave

    一些库有可选的单独编译的二进制文件:

  • Boost.DateTime 有一个二进制组件,仅当您使用其 to_string/from_string 或序列化功能,或者您的目标是 Visual C++ 6.x 或 Borland 时才需要该组件。

    李>
  • Boost.Graph 还有一个二进制组件,仅当您打算解析 GraphViz 文件时才需要该组件。 * Boost.Math 具有 TR1 和 C99 cmath 函数的二进制组件。
  • Boost.Random 有一个二进制组件,仅当您使用 random_device 时才需要该组件。
  • Boost.Test 可以在“仅标头”或“单独编译”模式下使用,但建议认真使用单独编译。

或者,您可以使用静态 (.a) Boost 库而不是共享 (.so) 链接您的程序,在这种情况下将有 NO 运行时依赖项。

或者您可以根据需要混合/匹配共享/统计信息。

选择权在你。

查看 Boost 文档:b2 Static and Shared libraries

【讨论】:

  • 我已经知道了这一切。如果我静态编译,我会收到问题中提到的警告。
  • 好的。两个额外的建议:1)在您的可执行文件上运行“ldd”以查看确切存在哪些共享依赖项(以及它们如何在您的开发 PC 上解决)。 2)将您的可执行文件测试部署到运行“全新安装”操作系统(没有您的开发库)的虚拟机(例如,VBox 或 VMWare)。 '希望对您有所帮助...
【解决方案2】:

如前所述,你需要使用 static 选项编译 boost,例如

bjam install --toolset=msvc variant=release link=static threading=multi runtime-link=static

您可以在此线程中获得更多信息 Do i have static or dynamic boost libraries?

需要注意的是,如果您对可执行文件执行 ldd,您可能会注意到 gcc/libc 库的一些运行时依赖项,即使您在静态模式下编译它也是如此。 这意味着您的客户端平台必须安装这些库。 90% 的时间它们都在那里,但是当您使用最新版本的编译器进行编译并且客户端使用的是旧版本时,情况可能会更加复杂。

【讨论】:

  • 我已经有了静态二进制文件。这个问题是关于运行时依赖关系以及如何为最终用户最小化它们。如果我没有二进制文件,我将无法编译。
猜你喜欢
  • 2016-01-14
  • 1970-01-01
  • 2011-05-25
  • 2018-08-22
  • 1970-01-01
  • 2010-09-15
  • 2015-11-30
  • 2015-12-28
  • 2016-07-21
相关资源
最近更新 更多