【问题标题】:Error Linking Boost Libraries With Quantlib将 Boost 库与 Quantlib 链接时出错
【发布时间】:2015-05-05 18:06:16
【问题描述】:

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

我遵循了here: 以及 Quantlib 网站上的说明。

我下载 boost_1_57_0 并将其解压缩到 C:\program files

然后我使用 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 时在屏幕上看到这些消息。这是我需要修复的错误吗?

【问题讨论】:

  • 根据你得到的错误,你没有安装 Visual Studio 或者它安装在 boost 找不到的地方。检查以确保已安装它。如果已安装,您可以从 VISUAL_STUDIO_INSTALL_DIR\VC\bin 中运行 vcvars32.bat 或 vcvars64.bat,这会将所有这些工具的路径添加到您的控制台环境中。然后,您应该能够构建。但老实说 boost 应该已经自动发现了它,所以我不确定是否存在更深层次的问题。
  • 更多关于手动设置使用 Visual Studio 构建命令行的路径。 stackoverflow.com/questions/7865432/…。请注意,无论它显示“Microsoft Visual Studio 10.0”,您可能正在运行更新的版本,最后的 10.0 可能是 11.0 或 12.0。只需在遵循这些说明时根据需要调整这些路径,其他一切都应该相同。

标签: boost visual-studio-2013 quantlib


【解决方案1】:

这正是我在另一个相关问题/答案中警告您的内容。这里发生的是,您包含在此 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 问题后遇到相同的错误,那么您收到此特定链接错误的唯一可能原因是您没有链接器抱怨丢失的任何文件存储在提供给链接器的任何目录中.

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

例子:

【讨论】:

  • 我仍然收到该错误,但文件名不同。错误 1 ​​错误 LNK1104: 无法打开文件 'boost_unit_test_framework.lib' C:\Program Files\QuantLib-1.5\test-suite\LINK testsuite
  • @Amatya 然后确保已将 boost 库的路径添加到链接器选项中。确保在 boost/stage 目录中有一个名为该文件的文件,然后确保已将所有 boost dll/lib 文件所在的 boost/stage/whatever 文件夹添加到链接器选项中。有关如何执行此操作的详细信息,请参阅此答案:stackoverflow.com/a/20059167/562566,特别是第 3 点
  • @Amatya 我添加了一个屏幕截图来提供帮助。它有点模糊,因为 SO 将它缩小了,但如果你右键单击并“查看图像”,你会看到一个更好、更高 rez 的版本。
  • 我在我的 boost_1_57_0 文件夹中进行了 *.lib 搜索,但一无所获。没有一个文件。然后我去了 boost/stage/lib 文件夹是空的并且字节大小为零。这是否意味着我没有任何 lib 文件?当我做 b2 等时,不应该建立库吗?
  • @Amatya 是的,我在上一个 q/a 中提供的说明确实应该编译出 .dll 和 .lib 文件。您提到删除并重新启动,也许这就是为什么?尝试重新运行命令。
猜你喜欢
  • 1970-01-01
  • 2015-11-23
  • 1970-01-01
  • 1970-01-01
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
相关资源
最近更新 更多