我正在 Ubuntu 下编写 Python2.7/PyQt4 程序,但应用程序将部署在 Windows 平台上。其中一个功能是应用程序应该捕获几个击键(例如“Alt+A”),即使它没有处于焦点/最小化状态。为此,我使用PyGlobalShortcut ,它是一个 Python/SIP 包装器libxqt。按照手册,我安装了 Qt4 + SIP并运行pip install PyGlobalShortcut
命令,它自动编译并安装了 libqxt 库和 Python 包装器。这完美无缺。
在 Windows 下原生构建
但是,我试图在 Windows 下安装 PyGlobalShortcut 时碰壁了。该软件包的二进制分发版已过时,这意味着我必须自己编译它。我必须安装 Qt4 + MinGW 并进行调整$PATH
,这不是问题。下一步是获取 SIP,不幸的是,它没有以 Py2.7 的二进制形式提供。我得到了 SIP 的源代码,但无法构建它:
sip-4.17 $ python configure.py --platform win32-g++
sip-4.17 $ make
make
立即返回找不到错误mingw32-make
的调用。我用谷歌搜索了一下,它似乎是 MS Visual Studio 的一个组件或类似的东西,但它与 MinGW 有什么关系?我找不到任何提供此 dll 或解释如何获取它的官方网站。MSVCR80.dll
Linux下的交叉编译
我还认为我可以使用MXE在 Linux 机器上交叉编译 PyGlobalShortcut 。我也没有做到这一点。我用这个 SO 答案作为指导。我有 MXE,交叉编译的 Qt4 并检查wine
它是否有效。然后我包含<mxe>/usr/bin
并尝试交叉编译 Windows 的 SIP <mxe>/usr/i686-w64-mingw32.static/qt/bin
。$PATH
它惨遭失败,因为 Makefile 调用本机 linuxg++
而不是 c++ 编译器MXE
:
sip-4.17 $ python configure.py --platform win32-g++
sip-4.17 $ make
make[1]: Entering directory `/home/ximeg/dev/sip-4.17/sipgen'
gcc -c -O2 -w -DNDEBUG -DUNICODE -DQT_LARGEFILE_SUPPORT -I. -o main.o main.c
gcc -c -O2 -w -DNDEBUG -DUNICODE -DQT_LARGEFILE_SUPPORT -I. -o transform.o transform.c
gcc -c -O2 -w -DNDEBUG -DUNICODE -DQT_LARGEFILE_SUPPORT -I. -o gencode.o gencode.c
gcc -c -O2 -w -DNDEBUG -DUNICODE -DQT_LARGEFILE_SUPPORT -I. -o extracts.o extracts.c
gcc -c -O2 -w -DNDEBUG -DUNICODE -DQT_LARGEFILE_SUPPORT -I. -o export.o export.c
gcc -c -O2 -w -DNDEBUG -DUNICODE -DQT_LARGEFILE_SUPPORT -I. -o heap.o heap.c
gcc -c -O2 -w -DNDEBUG -DUNICODE -DQT_LARGEFILE_SUPPORT -I. -o parser.o parser.c
gcc -c -O2 -w -DNDEBUG -DUNICODE -DQT_LARGEFILE_SUPPORT -I. -o lexer.o lexer.c
g++ -mthreads -Wl,-enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -Wl,-subsystem,console -Wl,-s -o sip main.o transform.o gencode.o extracts.o export.o heap.o parser.o lexer.o
main.o: file not recognized: File format not recognized
collect2: error: ld returned 1 exit status
make[1]: *** [sip] Error 1
make[1]: Leaving directory `/home/ximeg/dev/sip-4.17/sipgen'
make: *** [all] Error 2
所以我将编译器和链接器符号链接到<mxe>/usr/bin
,即i686-w64-mingw32.static-g++
到g++
等。这有帮助,但现在g++
需要 Python 库和头文件。它在下面查找它们/usr/include/python2.7
- 但它们是为 linux 编译的,因此不能链接到 windows 二进制文件。
sip-4.17 $ make
make[1]: Entering directory `/home/ximeg/dev/sip-4.17/sipgen'
gcc -c -O2 -w -DNDEBUG -DUNICODE -DQT_LARGEFILE_SUPPORT -I. -o main.o main.c
...
g++ -mthreads -Wl,-enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -Wl,-subsystem,console -Wl,-s -o sip main.o transform.o gencode.o extracts.o export.o heap.o parser.o lexer.o
make[1]: Leaving directory `/home/ximeg/dev/sip-4.17/sipgen'
make[1]: Entering directory `/home/ximeg/dev/sip-4.17/siplib'
gcc -c -O2 -w -DNDEBUG -DUNICODE -DQT_LARGEFILE_SUPPORT -I. -I/usr/include/python2.7 -o siplib.o siplib.c
In file included from /usr/include/python2.7/Python.h:8:0,
from siplib.c:20:
/usr/include/python2.7/pyconfig.h:78:3: error: #error unknown multiarch location for pyconfig.h
# error unknown multiarch location for pyconfig.h
^
In file included from /usr/include/python2.7/pyport.h:4:0,
from /usr/include/python2.7/Python.h:58,
from siplib.c:20:
/usr/include/python2.7/pyconfig.h:78:3: error: #error unknown multiarch location for pyconfig.h
# error unknown multiarch location for pyconfig.h
^
In file included from /usr/include/python2.7/pymath.h:4:0,
from /usr/include/python2.7/Python.h:77,
from siplib.c:20:
/usr/include/python2.7/pyconfig.h:78:3: error: #error unknown multiarch location for pyconfig.h
# error unknown multiarch location for pyconfig.h
^
siplib.c: In function 'wrapInstance':
siplib.c:1342:27: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'addr'
unsigned PY_LONG_LONG addr;
^
siplib.c:1342:27: error: 'addr' undeclared (first use in this function)
siplib.c:1342:27: note: each undeclared identifier is reported only once for each function it appears in
siplib.c: In function 'parsePass1':
siplib.c:4488:9: error: expected ';' before 'case'
case 'c':
^
siplib.c:4526:9: error: expected ';' before 'case'
case 'b':
^
make[1]: *** [siplib.o] Error 1
make[1]: Leaving directory `/home/ximeg/dev/sip-4.17/siplib'
make: *** [all] Error 2
看来我需要一个 Windows 版本的 Python 来编译这些东西,放在 下<mxe root>
,但是...... 来吧,现在它变得太复杂了。我很确定我在这里遗漏了一些简单的东西。不幸的是,我在为 Windows 编译方面没有太多经验,希望能得到任何帮助。
快捷方式的其他选项?
我不介意重写我的 Python 程序并使用任何其他跨平台库来捕获全局快捷方式,但除了 PyGlobalShortcut 之外我没有找到任何其他的。