我正在尝试使用Boost Libraries构建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。
选择“发布”和“x64”,在Property Manager中打开“Quantlib”并设置VC ++目录。
在include目录中,我添加了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。这是我需要解决的错误吗?
答案 0 :(得分:2)
这正是我在另一个相关问题/答案中警告过你的。这里发生的是你在这个quantlib中包含的boost头是(通过宏)检测到你正在使用MSVC,检测版本,然后使用#pragma comment(lib ...)自动链接所需的DLL文件来构建quantlib。 )。所以即使在项目设置下 - > C / C ++ - >链接器没有指定外部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”的选项命名它们。由于我们选择了layout = system,因此boost会像我们这样命名我们的库:
LIB_LIBRARY_NAME.LIB
实际上会产生:
libboost_unit_test_framework.lib
因此,当我们在执行此操作后开始使用boost(仅使用MSVC会发生这种情况)时,这些动态生成的链接器语句不会让您了解或了解您构建的-layout
选项。他们将尝试使用完全损坏的命名格式链接所需的库,这就是您收到错误的原因:
无法打开文件'libboost_unit_test_framework-vc120-mt-1_57.lib
..因为你没有一个名为的文件!这是错误的名字!您有一个名为libboost_unit_test_framework.lib的文件。看到不同!因此,您需要告诉这些愚蠢的宏在自动链接所需的库时停止修改库名称。您可以通过将以下预处理器定义添加到Quantlib项目来实现此目的:
BOOST_AUTO_LINK_NOMANGLE
您可以在“项目设置”中添加 - > C / C ++ - >预处理器 - >预处理器定义。
如果您宁愿避免这种头痛并且不关心对库名称进行强化的长期和(非常丑陋)修改,您可以构建增强省略-layout选项,它将默认为这种错误的命名约定,你不应该再陷入这个错误了。我个人努力保留好的短/清洁库名称,但这完全取决于偏好。
修改强>
由于在修复NO_MANGLE问题后出现相同的错误,因此您获得此特定链接错误的唯一可能原因是您没有链接器抱怨丢失的任何文件存储在提供给链接器的任何目录中
验证您提供给链接器的文件夹/路径,并验证链接器正在查找的文件位于您为链接器提供的目录之一。您必须向链接器提供目录,因为您告诉链接器“您可以在所有这些位置查找我的项目所需的库”。如果你指定none,它无处可寻。 :(
示例: