POCO:在Release中编译项目时,链接器要求MT而不是MD库

时间:2016-08-11 14:48:11

标签: c++ visual-studio-2012 linker poco poco-libraries

我有一个使用MD构建库的调试版本的VS2012项目(PocoFoundation mdd .lib等)。

发布模式下进行编译时,我正在使用相同库的发布版本(PocoFoundation md .lib) - 但VS2012然后突然拒绝链接并要求改为 MT 版本(PocoFoundationmt.lib)

error LNK1104: cannot open file 'PocoFoundationmt.lib'  

是什么导致POCO / VS在发布模式下寻找MT版本而不是MD版本?有什么想法吗?

这是VS2012在<​​strong> DEBUG 模式下使用的链接器命令(可以工作)

/OUT:"C:\xxx...\xxx.dll" /MANIFEST /NXCOMPAT /PDB:"C:\xxx...\xxx.pdb" /DYNAMICBASE "ssleay32.lib" "libeay32.lib" "cpprest120d_2_8.lib" "log4cppD.lib" "winhttp.lib" "Crypt32.lib" "Bcrypt.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /IMPLIB:"C:\xxx...\xxx.lib" /DEBUG /DLL /MACHINE:X86 /INCREMENTAL /PGD:"C:\xxx...\xxx.pgd" /SUBSYSTEM:WINDOWS /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"Debug\xxx.dll.intermediate.manifest" /ERRORREPORT:PROMPT /NOLOGO /LIBPATH:"..\libs\Poco\Debug" /TLBID:1  

..这里是 RELEASE 模式的链接器命令(不起作用)

/OUT:"C:\xxx...\xxx.dll" /MANIFEST /LTCG /NXCOMPAT /PDB:"C:\xxx...\xxx.pdb" /DYNAMICBASE "ssleay32.lib" "libeay32.lib" "cpprest120_2_8.lib" "log4cppLIB.lib" "winhttp.lib" "Crypt32.lib" "Bcrypt.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /IMPLIB:"C:\xxx...\xxx.lib" /DEBUG /DLL /MACHINE:X86 /OPT:REF /SAFESEH /INCREMENTAL:NO /PGD:"C:\xxx...\xxx.pgd" /SUBSYSTEM:WINDOWS /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"Release\xxx.dll.intermediate.manifest" /OPT:ICF /ERRORREPORT:PROMPT /NOLOGO /LIBPATH:"..\libs\Poco\Release" /TLBID:1 

3 个答案:

答案 0 :(得分:1)

如果没有看到编译命令行的样子,很难说清楚。也许您在其中一个标题中定义了POCO_STATIC?在已经包含Foundation.h之后可能会遇到该定义,并且链接将根据this logic进行。发布和调试之间可能存在差异。或者,您实际上可能在调试中链接mtd.lib并且已经构建了`PocoFoundationmtd.lib但没有PocoFoundationmt.lib,因此发布版本无法找到它。

阅读this answer可能会有所帮助。

答案 1 :(得分:0)

POCO_STATIC _DLL 添加到预处理程序定义中修复它!

(我还将同一项目中的所有其他LIBS重新编译为MD - 因为那里有一些MT库。)

谢谢!

答案 2 :(得分:-1)

在调试模式下编译的库通常与发布模式库完全不同,原因有很多:

  • 他们可能有错误处理/调试消息,这些消息在Release
  • 中对编译器不可见
  • 调试和发布之间的代码优化差异可能足以防止交叉编译
  • 在某些情况下,Debug和Release之间可能存在不同级别的功能。

一般情况下,除非您自己负责生成这些库,否则您需要为Debug和Release获取单独的版本,并确保您的项目配置为为每个配置获取正确的版本。