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



我有一个VS2012项目,使用MD构建库的调试版本(PocoFoundationmdd)。自由等)。#POCO_STATIC已经定义——一切都很好。

Release模式下编译时,我使用相同库的发布版本(PocoFoundationmd.lib) -但VS2012突然拒绝链接并要求MT版本代替(PocoFoundationmt.)。lib)

error LNK1104: cannot open file 'PocoFoundationmt.lib'  
是什么导致POCO/VS在发布模式下寻找MT版本而不是MD版本?什么好主意吗?

这是VS2012在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:"Debugxxx.dll.intermediate.manifest" /ERRORREPORT:PROMPT /NOLOGO /LIBPATH:"..libsPocoDebug" /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:"Releasexxx.dll.intermediate.manifest" /OPT:ICF /ERRORREPORT:PROMPT /NOLOGO /LIBPATH:"..libsPocoRelease" /TLBID:1 

如果不看编译命令行是什么样子,很难判断。也许你在你的头文件中定义了POCO_STATIC ?在已经包含Foundation.h之后可能会遇到该定义,并且链接将根据该逻辑进行。在发布版和调试版之间可能存在包含的差异。或者,您可能实际上在调试中链接mtd.lib并构建了' PocoFoundationmtd '。但不包括PocoFoundationmt。

阅读这个答案可能有帮助。

POCO_STATIC_DLL添加到预处理器定义中修复了它!

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

谢谢!

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

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

一般来说,除非您自己专门负责生成这些库,否则您将需要为调试和发布获取单独的版本,并确保您的项目配置为为每个配置获取正确的版本。

最新更新