人们如何分发对boost模块有二进制依赖的boost程序

How do people distrubute boost programs which have binary dependencies on boost modules?

本文关键字:boost 模块 二进制 依赖 程序      更新时间:2023-10-16

我有一个非常基本的客户端/服务器项目,使用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应用程序,我将如何改变?

我是一个全新的发布c++程序和使用动态/共享库的新手。

静态编译时,得到以下警告:

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

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

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

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

必须单独构建的Boost库有:

  • 提振。文件系统
  • 提振。GraphParallel
  • 提振。iostream
  • 提振。MPI
  • 提振。ProgramOptions
  • 提振。Python(参见Boost。Python构建文档(在构建和安装之前)
  • 提振。Regex
  • 提振。序列化
  • 提振。信号
  • 提振。系统
  • 提振。线程
  • 提振。波

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

  • 提振。DateTime有一个二进制组件,只有当你使用它的to_string/from_string或序列化特性,或者你的目标是Visual c++ 6时,才需要它。

  • 提振。Graph还有一个二进制组件,只有在打算解析GraphViz文件时才需要它。*提高。Math有二进制组件用于TR1和C99 cmath函数。
  • 提振。Random有一个二进制组件,只有当你使用random_device时才需要。
  • 提振。Test可以在"仅头文件"或"单独编译"模式下使用,但建议在严肃使用时单独编译。

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

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

选择在你。

查看Boost文档:b2静态和共享库

如前所述,您需要使用静态选项编译boost,例如

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

你可以在这个线程中获得更多信息我有静态或动态增强库吗?

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