我正在尝试在Visual Studio 2013中创建一个C ++项目,该项目具有CGAL和Boost(以及其他几个库)作为依赖项。我最好动态地链接到这些库。另外,出于性能原因,我想链接到这些库的“Release”版本(而不是“Debug”版本)。
从一个空的C ++项目开始,我添加了上述库头文件的路径,如下图所示:
在链接器选项中,我添加了包含外部库的DLL和lib文件的目录。 (CGAL
目录包含CGAL编译的DLL文件以及lib文件。)
此时,我还没有添加单个“lib”文件“Additional Dependencies”对话框:
现在出现了一些奇怪的事情,我无法解释原因。如果我尝试按原样构建项目(在“Debug”配置下),我收到关于链接器无法找到LNK1104
的{{1}}错误。我知道错误意味着我应该在“附加依赖关系”对话框中添加CGAL-vc120-mt-gd-4.7.lib
文件...
但等等......什么......?!!
Visual Studio如何知道如何自动链接此lib文件?!更糟糕的是,它如何知道它需要库的“调试”版本? (带lib
后缀)。另外,它怎么知道我用VS2013编译了CGAL !! ??
起初,我虽然该项目是从我系统中某处的某些预设属性表继承属性。但我确信情况并非如此,因为即使是从头开始创建的项目,这种行为也会显示出来。
我的主要问题是,您如何强制Visual Studio链接到此库的“发布”版本? (例如gd
)
附带问题但相关:我甚至链接DLL文件?我如何确定我在做动态链接而不是静态链接?
答案 0 :(得分:2)
由于#pragma comment(lib)
机制可能会发生这种情况 - 例如,请参阅What does "#pragma comment" mean?
这是编译器为链接器发出指令的一种方式,以便它可以根据编译器版本决定库的多个版本。在这种情况下,它意味着它可以自动获取正确版本的库(调试与发布,vs2013 vs vs2015,MT与MD等)。当您在Additional Dependencies中添加对库的显式引用时,它现在正在尝试查找两个文件。
因此,要解决此问题,请将其从Additional Dependencies中删除,然后让VS选择正确的库。如果您收到LNK1104错误,则表明链接库路径未正确设置,或者您没有找到它正在查找的CGAL库文件。您可以在“项目选项”中增加链接器的详细程度设置,以获取有关正在发生的事情的更多详细信息。