我对Linux 和终端非常缺乏经验,但我正在努力学习。我以前也从未包含过外部库。现在我需要将 Boost.Asio 库包含在 Ubuntu 中使用 G++ 开发的程序中。
有人可以从一开始就非常友善且非常仔细地解释如何解决这个问题吗?
编辑:
扩展最初的问题:如果我需要将此代码发送给其他人,以便他们在完全独立的机器上但在相同的环境中运行它,我该如何考虑这一点?如果整个过程涉及将库文件与代码放在同一个文件夹中,我是否只需将这些库文件与 .cpp 一起发送给其他人?
您已经提到您使用的是 Ubuntu,因此使用 boost 的最简单方法是首先安装libboost-all-dev
包(来自 synaptic),它将为您安装所有内容,包括需要编译的内容。然后你只需要以g++
通常的方式使用。
请注意版本是否是您想要的,如果不是,您可能需要自己安装。另一方面,boost 主要是仅标头库,因此您只需将文件(在 Ubuntu 中右键单击...)解压缩到一个文件夹并在编译时链接到它:
g++ hello_world.cpp -I boost_1_49_0/boost
最后一个指定编译器查找boost头文件的路径(请使用绝对路径)。
如果你想把你的程序发给别人,不要只复制一些boost文件,因为依赖,它不起作用。要求他们安装与您相同的环境,这很容易(只需解压缩文件...)。
我不知道您的特定 IDE 或具体的 Boost.Asio,但总的来说:
每当您需要链接到某个库时,都会有一个名为 的文件lib???.a
,您需要该文件。您需要将-l???
标志传递给以g++
链接到文件。
(我自己对细节不太熟悉,所以可能还有其他文件格式等等......)
关于编辑:
“正确”的方法是让他们自己下载库,然后传递-l???
给他们的链接器。在你的源代码中包含 Boost 会使它变得巨大,而且没有充分的理由......毕竟,它不像你在代码中包含 STL。
您不包含该库,而是声明对它的依赖。例如。考虑您使用autoconf和automake ,那么您将添加1来要求 boost 和要求 ASIO 库。在您的文件中,您使用和宏并依靠 ./configure 正确设置它们。然后,无论谁使用您的代码,都必须运行众所周知的脚本,该脚本将分析环境中的 boost 位置并在构建环境中设置适当的值,以便成功。AX_BOOST_BASE
AX_BOOST_ASIO
Makefile.am
BOOST_CPPFLAGS
BOOST_LDFLAGS
./configure
make
至少这是理论。在实践中,整个事情被称为autohell是有原因的。存在替代品,例如CMake或 boost 自己的bjam。但是概要总是相同的:您在构建配置中声明依赖项,并且使用您的产品的目标位置必须满足要求(这意味着它必须下载/安装所需的 boost 版本,在您的情况下)。否则,您将进入分发二进制文件的业务,并且由于您的应用程序预计将部署在其中的平台/架构/发行版的丰富性,这会引起问题。
显然,如果您使用不同的构建系统,例如ANT,那么您应该参考该构建系统文档,了解如何声明 boost 的要求。
1:ax_boost.m4
不是唯一的提升检测 m4 库,还有其他的,但它是 GNU autoconf 宏列表中记录的那个