将Boost库与Quantlib链接时出错

将Boost库与Quantlib链接时出错,boost,visual-studio-2013,quantlib,Boost,Visual Studio 2013,Quantlib,我正在尝试使用Boost库构建Quantlib 我遵循了说明:也在Quantlib网站上 我下载了boost_1_57_0并将其解压缩到C:\program文件中 然后,我使用Visual Studio 2013 x64本机提示符转到boost目录并运行 bootstrap.bat 然后 b2 --toolset=msvc --build-type=complete architecture=x86 address-model=64 stage 然后我在Visual Studio 2013中

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

我遵循了说明:也在Quantlib网站上

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

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

bootstrap.bat
然后

b2 --toolset=msvc --build-type=complete architecture=x86 address-model=64 stage
然后我在Visual Studio 2013中打开了Quantlib_vc12.sln

选择“Release”和“x64”,在属性管理器中打开“Quantlib”,并设置VC++目录

在include目录中,我添加了C:\Programm Files\boost\u 1\u 57\u 0

在库目录中,我添加了C:\Program Files\boost\u 1\u 57\u 0\stage\lib

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

我有一个LNK1104错误

LNK1104: cannot open file 'libboost_unit_test_framework-vc120-mt-1_57.lib
请参阅随附的屏幕截图:

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

更新:在将BOOST\u AUTO\u LINK\u NOMANGLE define添加到项目后,仍然会出现相同的错误。

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


这正是我在另一个相关问题/答案中警告过你的。这里发生的事情是,您在这个quantlib中包含的boost头(通过宏)检测到您正在使用MSVC,检测版本,然后使用#pragma comment(lib…)自动链接所需的DLL文件以构建quantlib。因此,即使在Project Settings->C/C++->Linker下没有指定外部DLL或库,它们仍然由这些pragma语句链接

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

LIB_LIBRARY_NAME_COMPILER_VERSION_single或multi threaded_BOOST_VERSION.LIB

实际上是这样的:

libboost\u单元测试\u框架-vc120-mt-1\u 57.lib

这是boost“弄乱”您的库的名称,以便尽可能描述库是如何构建的,这样,只要看一下文件名,您就知道了。我们对-layout=system所做的是告诉boost构建系统不要弄乱名称,而是根据我们为“layout”提供的选项来命名它们。由于我们选择layout=system,boost将对我们的库命名如下:

LIB\u LIBRARY\u NAME.LIB

这实际上将产生:

libboost\u unit\u test\u framework.lib

因此,当我们在这样做之后开始使用boost时(只有MSVC才会这样做),这些动态生成的链接器语句不会对构建boost时使用的
-layout
选项给出任何提示或了解。他们将尝试使用完全损坏的命名格式链接到所需的库中,这就是您出现错误的原因:

无法打开文件“libboost\u unit\u test\u framework-vc120-mt-1\u 57.lib”

。。因为你没有一个叫它的文件!那是一个被弄坏的名字!您有一个名为libboost\u unit\u test\u framework.lib的文件。看到区别了吧!因此,当自动链接所需的库时,您需要告诉这些愚蠢的宏停止损坏库名称。您可以通过将以下预处理器定义添加到Quantlib项目中来实现这一点:

增压(自动)(链接)(无角度)

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

如果您希望避免这种头痛,并且不关心boost对库名称造成的冗长(我觉得很难看)的损坏,那么您可以构建boost,省去-layout选项,它将默认为这种损坏的命名约定,您不应该再陷入这个错误中。我个人努力保持库名简洁明了,但这完全是出于偏好

编辑
由于在修复无损坏问题后出现了相同的错误,因此出现此特定链接错误的唯一可能原因是,在提供给链接器的任何目录中,都没有链接器抱怨丢失的任何文件

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

例如:


我仍然收到该错误,但文件名不同。错误1错误LNK1104:无法打开文件“boost\u unit\u test\u framework.lib”C:\Program Files\QuantLib-1.5\test suite\LINKtestsuite@Amatya然后确保链接器选项中添加了指向boost库的路径。确保boost/stage目录中有一个名为该路径的文件,然后确保已将所有boost dll/lib文件所在的boost/stage/where文件夹添加到链接器选项中。有关如何执行此操作的详细信息,请参见以下答案:,特别是#3@Amatya我添加了一个屏幕截图来帮助你。它有点模糊,因为它缩小了,但是如果你右键点击“查看图像”您将看到一个更好、更高的rez版本。我在boost_1_57_0文件夹中搜索了*.lib,但什么也没找到。没有找到一个文件。然后我转到boost/stage/lib和该文件夹