MTd Vs MDd - Статическая компоновка библиотеки win32 в QT Creator - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть статическая библиотека, созданная с помощью 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), все работает отлично.

...