来自 Qt Creator 中 VS2008 的 lib




我正在从VS2008迁移到Qt Creator(但仍在Windows上使用msvc2008编译器),并且我有一个使用VS2008编译的库(.lib)。
现在,在Windows上的Qt Creator中,它与我的程序没有链接,我得到了未解析的外部。
知道为什么会这样吗?
我尝试将所有编译器标志设置为与Visual Studio中相同的内容(其中链接没有问题)。哪些不同的编译器标志会导致这种情况?VS 编译命令:

/Od /I "XXXinc" /I ".GeneratedFiles" /I "C:QtSDKDesktopQt4.8.1msvc2008include" /I ".GeneratedFilesDebug" /I "C:QtSDKDesktopQt4.8.1msvc2008includeqtmain" /I "C:QtSDKDesktopQt4.8.1msvc2008includeQtCore" /I "C:QtSDKDesktopQt4.8.1msvc2008includeQtGui" /I "C:QtSDKDesktopQt4.8.1msvc2008includeQtSql" /I ".\" /I "XXXinc" /D "UNICODE" /D "WIN32" /D "QT_LARGEFILE_SUPPORT" /D "QT_CORE_LIB" /D "QT_GUI_LIB" /D "QT_SQL_LIB" /D "QT_PLUGIN" /D "_AFXDLL" /D "_DEBUG" /D "QT_DLL" /D "_WINDLL" /D "_UNICODE" /FD /EHsc /MDd /Yu"preHeader.h" /Fp"XXXbuildXXXDebugXXX.pch" /Fo"CXXXbuildXXXDebug\" /Fd"XXXbuildXXXDebugvc90.pdb" /nologo /c /Zi /TP /errorReport:prompt

Qt Creator 编译命令:

cl -c -FIpreHeader.h -YupreHeader.h -FpdebugXXX_pch.pch -nologo -Zm200 -Zc:wchar_t -Zi -MDd -GR -EHsc -W3 -w34100 -w34189 -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_LARGEFILE_SUPPORT -DQT_SQL_LIB -DQT_DLL -D_UNICODE -DUNICODE -D_AFXDLL -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED -DQT_DLL -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"c:QtSDKDesktopQt4.8.1msvc2008includeQtCore" -I"c:QtSDKDesktopQt4.8.1msvc2008includeQtNetwork" -I"c:QtSDKDesktopQt4.8.1msvc2008includeQtGui" -I"c:QtSDKDesktopQt4.8.1msvc2008includeQtSql" -I"c:QtSDKDesktopQt4.8.1msvc2008include" -I"..inc" -I"GeneratedFiles" -I"GeneratedFilesdebug" -I"C:QtSDKDesktopQt4.8.1msvc2008\include" -I"C:QtSDKDesktopQt4.8.1msvc2008\includeQtCore" -I"c:libboost_1_48_0" -I"c:QtSDKDesktopQt4.8.1msvc2008includeActiveQt" -I"GeneratedFilesdebug" -I"c:QtSDKDesktopQt4.8.1msvc2008mkspecswin32-msvc2008" -Fodebug @XXXTempqrc_resource.obj.1104.11375.jom

第二个有趣的事情是,在Linux上的Qt Creator中,相同的代码,相同的项目,它与Visual Studio中编译的库链接并解析这些外部问题。

找到了。
问题是...提升版!
库是用 boost 1.38 编译的,它int32_t定义为"long",而应用程序是用 boost 1.48 构建的,它int32_t定义为"int"。
因此,从库中导出的符号是"long FuncName(...)",其中应用程序试图在库中查找"int FuncName(...)"但无法做到这一点。
这仍然很奇怪,因为"int"和"long"在我的机器上是 32 位......它们应该是相同的。

哦,Linux 版本在 1.41 中有提升,它int32_t定义为"int",所以它工作了。

相关内容

最新更新