我有一个使用 Qt5(也可以使用 Qt4 编译)的 C++ 项目,我想在 python 中使用它(最好是 3.4)。为了做到这一点,我使用 PyQt4(因为据我所知,QtXml 模块在 PyQt5 中不再可用)和 sip。这一切都在我的 linux 机器上完美运行。但不幸的是,我需要它用于 Windows 并且无法运行它。到目前为止我做了什么:
- 一个没有 Qt 或其他依赖项(一个返回整数的函数)的非常小的示例有效。即使使用 gcc。但是在我的项目中出现“bad reloc”错误后,我切换到了 MSVC
- 我的 python 3.4 是用“MSC v.1600 32 位(英特尔)”“在 win32”上构建的,所以根据我的计算机上的 Python 是用什么版本的 Visual Studio 编译的?我下载了 Qt 5.2.1 MSVC 2010和 Microsoft Visual Studio Express 2010 SP1
- 我假设预编译的 PyQt4-4.11.2-gpl-Py3.4-Qt5.3.1-x32 应该适合
- 为了获得 sip.h 和 sipconfig.py 文件,我编译了 sip (4.16.3)。
从现在开始,我不确定该怎么做。我不得不承认我对图书馆一无所知。
- C++/Qt 项目使用 QtCreator
CONFIG += staticlib
和TEMPLATE = lib
. 生成的 *.lib(此处:xml2db.lib)被复制到我的 sip 文件所在的文件夹(例如 sipxml2dbcmodule.cpp)
因此,通过“VS 命令提示符”,nmake 会引发致命(链接)错误。我不确定所需的编译器标志应该是什么,或者 staticlib 是否错误。我的标志是:
LFLAGS = /NOLOGO /DYNAMICBASE /NXCOMPAT /DLL /MANIFEST /MANIFESTFILE:$(TARGET).manifest /SUBSYSTEM:WINDOWS /INCREMENTAL:NO /NODEFAULTLIB:library /LIBPATH:/LIBPATH:C:\Qt\5.2.1\msvc2010\lib
LIBS = /LIBPATH:C:\Python34\libs python34.lib xml2db.lib /LIBPATH:C:\Qt\5.2.1\msvc2010\lib\Qt5Xmld.lib C:\Qt\5.2.1\msvc2010\lib\Qt5Sqld.lib C:\Qt\5.2.1\msvc2010\lib\Qt5Cored.lib
$(TARGET): $(OFILES)
$(LINK) $(LFLAGS) /OUT:$(TARGET) $(OFILES) $(LIBS)
目标是“myTools.pyd”。结果是
sipmyToolscmodule.cpp
sipmyToolsxml2db.cpp
Generating Code...
link /NOLOGO /DYNAMICBASE /NXCOMPAT /DLL /MANIFEST /MANIFESTFILE:myTools
.pyd.manifest /SUBSYSTEM:WINDOWS /INCREMENTAL:NO /NODEFAULTLIB:library /LIBPATH:
C:\Qt\5.2.1\msvc2010\lib /OUT:myTools.pyd sipmyToolscmodule.obj sipmyToolsxml2db
.obj /LIBPATH:C:\Python34\libs python34.lib xml2db.lib /LIBPATH:C:\Qt\5.2.1\msvc
2010\lib\Qt5Xmld.lib C:\Qt\5.2.1\msvc2010\lib\Qt5Sqld.lib C:\Qt\5.2.1\msvc2010\l
ib\Qt5Cored.lib
xml2db.lib(xml2db.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_L
EVEL': value '2' doesn't match value '0' in sipmyToolscmodule.obj
MSVCRTD.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_i
nfo(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) already defined in LIB
CMT.lib(typinfo.obj)
MSVCRTD.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall
type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z)
already defined in LIBCMT.lib(typinfo.obj)
Creating library myTools.lib and object myTools.exp
LINK : warning LNK4098: defaultlib 'MSVCRTD' conflicts with use of other libs; u
se /NODEFAULTLIB:library
myTools.pyd : fatal error LNK1169: one or more multiply defined symbols found
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 10.0
\VC\BIN\link.EXE"' : return code '0x491'
Stop.
我会很高兴得到一个答案或新的想法。提前致谢。
编辑 我不确切知道我是如何解决它的,但这里有一些帮助我解决它的提示。
- 由于 sip 5 没有构建系统,我尝试创建一个 qmake 项目。为此,我下载了 pyqt 源包并查看了项目文件并根据我的需要进行了调整。
- 特别是当您更改 qmake 项目文件时,删除 make、object 和/或 moc 文件可能很有用。
- qt 版本应该与 pyqt 版本完美匹配(实际上我不是指版本本身,而是编译它的 qt 版本)
祝有类似问题的人好运