Visual Studio(C ++)自动链接到不需要的lib文件版本

时间:2015-11-11 22:59:34

标签: c++ visual-studio visual-studio-2013 linker

我正在尝试在Visual Studio 2013中创建一个C ++项目,该项目具有CGAL和Boost(以及其他几个库)作为依赖项。我最好动态地链接到这些库。另外,出于性能原因,我想链接到这些库的“Release”版本(而不是“Debug”版本)。

从一个空的C ++项目开始,我添加了上述库头文件的路径,如下图所示:

Include directories

在链接器选项中,我添加了包含外部库的DLL和lib文件的目录。 (CGAL目录包含CGAL编译的DLL文件以及lib文件。)

enter image description here

此时,我还没有添加单个“lib”文件“Additional Dependencies”对话框:

enter image description here

现在出现了一些奇怪的事情,我无法解释原因。如果我尝试按原样构建项目(在“Debug”配置下),我收​​到关于链接器无法找到LNK1104的{​​{1}}错误。我知道错误意味着我应该在“附加依赖关系”对话框中添加CGAL-vc120-mt-gd-4.7.lib文件...

enter image description here

但等等......什么......?!!
Visual Studio如何知道如何自动链接此lib文件?!更糟糕的是,它如何知道它需要库的“调试”版本? (带lib后缀)。另外,它怎么知道我用VS2013编译了CGAL !! ?? 起初,我虽然该项目是从我系统中某处的某些预设属性表继承属性。但我确信情况并非如此,因为即使是从头开始创建的项目,这种行为也会显示出来。

我的主要问题是,您如何强制Visual Studio链接到此库的“发布”版本? (例如gd

附带问题但相关:我甚至链接DLL文件?我如何确定我在做动态链接而不是静态链接?

1 个答案:

答案 0 :(得分:2)

由于#pragma comment(lib)机制可能会发生这种情况 - 例如,请参阅What does "#pragma comment" mean?

这是编译器为链接器发出指令的一种方式,以便它可以根据编译器版本决定库的多个版本。在这种情况下,它意味着它可以自动获取正确版本的库(调试与发布,vs2013 vs vs2015,MT与MD等)。当您在Additional Dependencies中添加对库的显式引用时,它现在正在尝试查找两个文件。

因此,要解决此问题,请将其从Additional Dependencies中删除,然后让VS选择正确的库。如果您收到LNK1104错误,则表明链接库路径未正确设置,或者您没有找到它正在查找的CGAL库文件。您可以在“项目选项”中增加链接器的详细程度设置,以获取有关正在发生的事情的更多详细信息。