2

我正在 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 之外我没有找到任何其他的。

4

0 回答 0