У меня есть статическая библиотека, созданная с помощью 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 создал CFLAGS и CXXFLAGS с -MDd
.Что, очевидно, привело к несоответствию.
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
Как вы можете видеть, библиотека - это полный путь, а НЕ стиль CMAKE с -L и -l (что создает проблемы при связывании библиотек win32 Visual Studio)
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
Итак, мой вопрос:
- Несмотря на то, что библиотеку просят связать статически, почему QT Creator жалуется, что она несовместима с -MDd
, чтодинамическое связывание.(Я пытался поместить флаг в файл .pro
, но он переопределяется)
QMAKE_CFLAGS += /MTd
QMAKE_CXXFLAGS += /MTd
(cl : Command line warning D9025 : overriding '/MTd' with '/MDd'
)
-Попробовал вручную изменить CFLAGS
и CXXFLAGS
в Makefile.Debug
, но это создало еще больше проблем, поскольку QMake теперь пытается статически связать каждую зависимую библиотеку.Разве нет способа просто статически связать одну библиотеку и все остальное как динамическое в QT Creator?
Использование - VS2017, QT Creator 4.8, QT 5.9, msvc2015 32bit, xerces-c-3.1.4
Кстати, если связаны с динамическими библиотеками (с lib и dll), все работает отлично.