【发布时间】:2016-02-13 04:29:17
【问题描述】:
我正在尝试在 Visual Studio 2013 中创建一个具有 CGAL 和 Boost(以及其他几个库)作为依赖项的 C++ 项目。我最好喜欢动态链接到这些库。另外,出于性能原因,我想链接到这些库的“发布”版本(而不是“调试”版本)。
从一个空的 C++ 项目开始,我添加了上述库的头文件的路径,如下图所示:
在链接器选项中,我添加了包含外部库的 DLL 和 lib 文件的目录。 (CGAL 目录包含 CGAL 编译的 DLL 文件以及 lib 文件)。
此时,我还没有添加单个“lib”文件“附加依赖项”对话框:
现在发生了一些奇怪的事情,我无法解释原因。如果我尝试按原样构建项目(在“调试”配置下),我会收到一个关于链接器无法找到 CGAL-vc120-mt-gd-4.7.lib 的 LNK1104 错误。我知道错误意味着我应该在“附加依赖项”对话框中添加lib 文件...
但是等等...什么...?!!
Visual Studio 如何知道如何自动链接到这个 lib 文件?!更糟糕的是,它怎么知道它需要库的“调试”版本? (带有gd 后缀)。另外,它怎么知道我用 VS2013 编译了 CGAL !!??
起初,我认为该项目是从我系统中某处的某些预设属性表中继承属性。但我确信情况并非如此,因为即使是从头开始创建的项目也会显示这种行为。
我的主要问题是,您将如何强制 Visual Studio 链接到该库的“发布”版本? (例如CGAL-vc120-mt-4.7.lib)
附带问题但相关:我什至链接到 DLL 文件吗?我如何确定我确实在做动态链接而不是静态链接?
【问题讨论】:
-
有一个
#pragma (comment:lib)support.microsoft.com/en-us/kb/153901 可以用来自动指定链接到哪个库。不知道这是否是您的方案正在做的事情,但这是不必使用项目设置指定库的一种方法。 -
图书馆作者通常试图打败这种“我如何以无法诊断的方式使图书馆代码崩溃”的恶作剧。很明显,CGAL 作者采用了 Boost 使用的技术,它非常可靠。不得不处理成千上万的邮件列表问题所激发的智慧。使用 /NODEFAULTLIB 链接器选项的功能,而不是大众汽车,后果自负。
-
@HansPassant 感谢您的提示。那么CGAL作者怎么会提前知道lib文件应该是什么?!仅当我使用 VS2013 编译并启用 MT 时,我才会得到
CGAL-vc120-mt-gd-4.7.lib!他们会使用什么机制来强制使用特定的库版本? -
它们使用预定义的宏,即编译器根据编译选项设置的宏。像 _DLL 一样,在您使用 /MD 编译时定义。 “mt”表示多线程,与 /MT 编译选项无关。他们开的是不同的大众汽车。
-
当然可以,但是你必须选择你不喜欢的编译设置。您只能希望发布构建库与您的代码的发布构建一起使用。调试这样的代码是,呃,字符构建。
标签: c++ visual-studio visual-studio-2013 linker