1

我正在尝试使用 Boost 库构建 Quantlib。

我按照此处的说明进行操作:以及 Quantlib 网站上的说明。

我将 boost_1_57_0 下载并解压缩到 C:\program 文件中

然后我使用 Visual Studio 2013 x64 Native 提示符转到 boost 目录并运行

bootstrap.bat

接着

b2 --toolset=msvc --build-type=complete architecture=x86 address-model=64 stage

然后我在 Visual Studio 2013 中打开了 Quantlib_vc12.sln。

选择“Release”和“x64”,在 Property Manager 中打开“Quantlib”并设置 VC++ 目录。

在包含目录中,我添加了 C:\Programm Files\boost_1_57_0

在库目录中,我添加了 C:\Program Files\boost_1_57_0\stage\lib

然后我转到解决方案资源管理器并右键单击并选择构建。

我收到一个 LNK1104 错误。

LNK1104: cannot open file 'libboost_unit_test_framework-vc120-mt-1_57.lib

请看附件截图:

在此处输入图像描述

我不知道如何解决这个问题,我真的很感激一些帮助。我已经使用管理员帐户在工作中成功安装了它,但无法使用我的用户帐户访问 Quantlib。此后,我已删除并尝试安装至少 15 次,但它无法正常工作。我担心所有这些安装尝试可能会弄乱其他东西,比如一些注册表(我不知道它是如何工作的,但我只知道害怕)。请帮忙!谢谢。

更新:将 BOOST_AUTO_LINK_NOMANGLE 定义添加到项目后仍然会出现相同的错误。

在此处输入图像描述

UPDATE2:我在运行 b2 以构建 boost 时在屏幕上收到这些消息。这是我需要修复的错误吗?

在此处输入图像描述

4

1 回答 1

2

这正是我在另一个相关问题/答案中警告您的内容。这里发生的是,您包含在此 quantlib 中的 boost 标头(通过宏)检测您正在使用 MSVC,检测版本,然后使用 #pragma comment(lib... .)。因此,即使在 Project Settings -> C/C++ -> Linker 下没有指定外部 DLL 或 Lib,它们仍然被这些 pragma 语句链接。

因此,当这些宏正在检测您的编译器等时,它们会动态地构建一个字符串名称,该字符串名称是他们认为所需的库将在您的系统上命名的名称。请记住,当您构建 boost 时,您指定了 -layout 选项。这是你的 boost 库的命名布局。那么默认情况下,该布局是这样的:

LIB_LIBRARY_NAME_COMPILER_VERSION_SingleOrMultiThreaded_BOOST_VERSION.LIB

在实践中看起来像这样:

libboost_unit_test_framework-vc120-mt-1_57.lib

这是提升“修改”库的名称,以尽可能描述库的构建方式,这样,只需看一下文件名,你就知道了。我们对 -layout=system 所做的是告诉 boost 构建系统不要破坏名称,而是根据我们为“布局”提供的选项来命名它们。由于我们选择了 layout=system,boost 将像这样命名我们的库:

LIB_LIBRARY_NAME.LIB

在实践中会产生:

libboost_unit_test_framework.lib

因此,当我们在这样做之后开始使用 boost 时(只有 MSVC 会发生这种情况),这些动态生成的链接器语句不会让人知道或知道-layout您使用什么选项来构建 boost。他们将尝试使用完全损坏的命名格式链接所需的库,这就是您收到错误的原因:

无法打开文件'libboost_unit_test_framework-vc120-mt-1_57.lib

..因为你没有一个名为那个的文件!就是这个乱七八糟的名字!您有一个名为 libboost_unit_test_framework.lib 的文件。看到不同!因此,您需要告诉这些愚蠢的宏在自动链接所需库时停止修改库名称。您可以通过将以下预处理器定义添加到您的 Quantlib 项目中来做到这一点:

BOOST_AUTO_LINK_NOMANGLE

您在项目设置 -> C/C++ -> 预处理器 -> 预处理器定义中添加它。

如果您宁愿避免这种头痛并且不关心 boost 对库名称所做的冗长和(imo 丑陋的)重整,您可以构建 boost 省略 -layout 选项,它将默认使用这种重整的命名约定,您根本不应该陷入这个错误。我个人努力保持漂亮的简短/干净的库名称,但这完全取决于偏好。

编辑
由于您在修复 NO_MANGLE 问题后遇到相同的错误,那么您收到此特定链接错误的唯一可能原因是您没有链接器抱怨丢失的任何文件存储在提供给链接器。

验证您提供给链接器的文件夹/路径,并验证链接器正在查找的文件是否位于您提供给链接器的目录之一中。您必须向链接器提供目录,因为您告诉链接器“您可以在所有这些地方查找我的项目需要的库”。如果您指定无,则无处可寻。:(

例子:

链接器搜索目录示例 Visual Studio 2013

于 2015-05-06T06:38:34.500 回答