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

M2X*_*M2X 3 c++ linker visual-studio visual-studio-2013

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

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

包含目录

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

在此处输入图片说明

此时,我还没有添加单个“lib”文件“附加依赖项”对话框:

在此处输入图片说明

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

在此处输入图片说明

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

我的主要问题是,您将如何强制 Visual Studio 链接到该库的“发布”版本?(例如。CGAL-vc120-mt-4.7.lib

附带问题但相关:我什至链接到 DLL 文件吗?我如何确定我确实在进行动态链接而不是静态链接?

the*_*ill 5

这可能是由于#pragma comment(lib)机制而发生的- 例如,请参阅“#pragma comment”是什么意思?

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

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