MTd与MDd-QT Creator中的静态链接win32库

时间:2019-02-13 16:09:50

标签: c++ qt static-libraries qmake static-linking

我有一个使用Visual Studio构建的静态库作为静态库(使用“运行时库:多线程调试(/ MTd)构建)”。但是,当我在QT项目中使用它时,它表示不匹配。

xerces-c_static_3d.lib(XMLString.obj):-1: error: LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in helloworld.obj

相关的Makefile.Debug如下所示,如您所见,QT Creator使用-MDd创建了CFLAGS和CXXFLAGS。显然造成了不匹配。

CC            = cl
CXX           = cl
DEFINES       = -DUNICODE -DWIN32 -DQT_DEPRECATED_WARNINGS -DQT_QML_DEBUG -DQT_CORE_LIB
CFLAGS        = -nologo -Zc:wchar_t -FS -Zc:strictStrings -Zi -MDd -W3 -w44456 -w44457 -w44458 /Fddebug\testbed.vc.pdb $(DEFINES)
CXXFLAGS      = -nologo -Zc:wchar_t -FS -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zi -MDd -W3 -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 -wd4577 -wd4467 -EHsc /Fddebug\testbed.vc.pdb $(DEFINES)
INCPATH       = -I..\testbed -I. -I..\testbed\libxsd -I..\..\..\..\Qt\5.9\msvc2015\include -I..\..\..\..\Qt\5.9\msvc2015\include\QtCore -Idebug -I..\..\..\..\Qt\5.9\msvc2015\mkspecs\win32-msvc 
LINKER        = link
LFLAGS        = /NOLOGO /DYNAMICBASE /NXCOMPAT /DEBUG /SUBSYSTEM:CONSOLE "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'"
LIBS          = C:\Users\intellitix\Documents\testbed\libxsd\lib\xerces-c_static_3d.lib /LIBPATH:C:\Qt\5.9\msvc2015\lib C:\Qt\5.9\msvc2015\lib\Qt5Cored.lib 
QMAKE         = C:\Qt\5.9\msvc2015\bin\qmake.exe

摘录自testbed.pro 如您所见,库是完整路径,而不是带有-L和-l的CMAKE样式(在通过Visual Studio链接win32库时会出现问题)

win32:CONFIG(release, debug|release): LIBS += $$PWD/libxsd/lib/xerces-c_static_3.lib
else:win32:CONFIG(debug, debug|release): LIBS += $$PWD/libxsd/lib/xerces-c_static_3d.lib
else:unix: LIBS += $$PWD/libxsd/lib/xerces-c_static_3.lib

INCLUDEPATH += $$PWD/libxsd
DEPENDPATH += $$PWD/libxsd

win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/libxsd/lib/libxerces-c_static_3.a
else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/libxsd/lib/libxerces-c_static_3d.a
else:win32:!win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/libxsd/lib/xerces-c_static_3.lib
else:win32:!win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/libxsd/lib/xerces-c_static_3d.lib
else:unix: PRE_TARGETDEPS += $$PWD/libxsd/lib/libxerces-c_static_3.a

所以我的问题是,

-即使要求lib进行静态链接,但为什么QT Creator抱怨它与-MDd不兼容,后者是动态链接。 (我曾尝试将标志放入.pro文件中,但被覆盖了)

QMAKE_CFLAGS += /MTd
QMAKE_CXXFLAGS += /MTd

({cl : Command line warning D9025 : overriding '/MTd' with '/MDd'

-尝试手动更改CFLAGS中的CXXFLAGSMakefile.Debug,但是由于QMake现在尝试静态链接每个从属库,因此造成了更多问题。在QT Creator中,没有办法仅静态链接一个库,而将其他所有库动态链接吗?

使用- VS2017, QT Creator 4.8, QT 5.9, msvc2015 32位, xerces-c-3.1.4

顺便说一句,如果链接到动态库(带有lib和dll),则一切正常。

0 个答案:

没有答案