【问题标题】:Problem with Boost::Asio for C++Boost::Asio for C++ 的问题
【发布时间】:2010-04-10 14:19:20
【问题描述】:

对于我的学士学位论文,我正在实现一个分布式版本的算法,用于分解大整数(寻找素数分解)。这在例如RSA 密码系统的安全性。

我的愿景是,客户端(Linux 或 Windows)将下载应用程序并计算一些数字(这些是独立的,因此适合并行化)。这些号码(不经常找到)将被发送到主服务器,以收集这些号码。一旦主服务器收集到足够多的数字,它将执行其余的计算,这些计算不容易并行化。

无论如何,到技术细节。我正在考虑使用 Boost::Asio 来实现套接字客户端/服务器,以便客户端与主服务器进行通信。因为我想同时为 linux 和 windows 编译,所以我认为 windows 是一个很好的起点。所以我下载了 Boost 库并编译它,正如 Boost Getting Started page 上所说的:

引导

.\bjam

这一切都编译得很好。然后我尝试编译来自 Asio 的教程示例 client.cpp 之一,发现(这里.. 编辑:由于限制无法发布链接)。我正在使用 Microsoft Visual Studio 2008 中的 Visual C++ 编译器,如下所示:

cl /EHsc /ID:\Downloads\boost_1_42_0 client.cpp

但我收到此错误:

/out:client.exe

client.obj

LINK:致命错误 LNK1104:无法打开文件“libboost_system-vc90-mt-s-1_42.lib”

有人知道可能出了什么问题,或者我该如何继续前进吗?我几乎整个星期都在尝试,为 C++ 工作获得一个简单的客户端/服务器套接字程序,但没有运气。严重的挫败感开始了。

提前谢谢你。

【问题讨论】:

    标签: boost boost-asio distributed-computing


    【解决方案1】:

    构建失败的原因是它找不到包含boost系统的库文件。 Boost 包含一个“方便的”自动链接功能,因此当您包含二进制 libaray 的头文件(与仅头文件库相反)时,boost 会自动告诉编译器它应该链接到库中。这样做的缺点是 boost 不会告诉编译器在哪里可以找到库。

    简短的回答是进一步阅读 boost 入门指南。此页面向您展示如何将必要的标志添加到编译器命令行:Getting started on windows: linking from the command line

    您要做的第一件事是找到 .lib 文件。 Boost 将它们隐藏在一个很深的目录结构中,所以从你运行 bjam 的目录开始搜索它。记下文件所在的目录。您可能还希望使用 bootstrap --prefix=/some/install/locationbjam install 将 boost 安装在您构建它的源目录之外的其他位置。

    您是使用 Visual Studio 解决方案还是在命令行上构建项目?

    如果您使用的是解决方案文件,请在解决方案属性中找到链接页面。应该有一个框,您可以在其中输入其他库路径。将升压 .lib 文件所在的目录添加到此框中。

    如果您在命令链接上使用 cl,请熟悉 cllink 的命令行选项。您可以使用cl 选项/link 将命令传递给链接器,而您要查找的链接器命令是/libpath

    【讨论】:

    • 您好,谢谢您的回答。重新编译 Boost 后,我​​发现一些 .lib 文件的名称与我需要的非常相似,例如:libboost_system-vc90-mt.lib libboost_system-vc90-mt-1_42.lib libboost_system-vc90-mt-gd .lib libboost_system-vc90-mt-gd-1_42.lib 但没有一个具有它所抱怨的确切名称,即 libboost_system-vc90-mt-s-1_42.lib。所以我不确定从这里去哪里? -s 是否意味着它是一个静态库,如果是,我如何告诉 Boost 我想这样编译?我正在从命令提示符编译所有内容。
    • -s 表示它正在寻找一个静态链接到 C++ 标准库和运行时的库。要构建这个库,请尝试bjam link=static link=shared runtime-link=static runtime-link=shared,它应该构建所有可能的组合。
    • 谢谢mch,我通过重新解压缩boost,然后进行booststrap,然后是bjam link=static runtime-link=static,让它工作了。然后我将库路径(/stage/lib/)作为标志添加到 cl。谢谢!
    • 你好。今天我需要让我的程序工作,既可以使用 Boost::Asio 库,也可以使用另一个库 (NTL)。对于这个 NTL 库,我只能通过 Visual Studio 编译我的程序(而不是通过命令提示符)。所以我想我会使用 Visual Studio 并将我的项目设置为同时使用这两个库,并希望获得最好的……机会!现在它抱怨文件“libboost_system-vc90-mt-gd-1_42.lib”丢失,而昨天它是“libboost_system-vc90-mt-s-1_42.lib”。我是否需要将我的 Visual Studio 设置为使用静态库或其他东西,还是应该再次编译 Boost?
    • -gd- 表示它正在寻找标准库和运行时库的调试版本,以及 boost 库的调试版本。您需要像这样构建 boost:bjam variant=debug variant=release link=static link=shared runtime-link=static runtime-link=shared 以获取调试版本。
    猜你喜欢
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多