在 macOS 上安装 PyQt4 时 C++ 标准库出现问题

Problem with C++ standard library when installing PyQt4 on macOS

我正在尝试构建 PyQt 4,因为它被我需要的程序使用 运行。

虽然使用单个命令安装 PyQt 5 是微不足道的 pip install PyQt5,但对于较旧的 PyQt 4 是不可能的,人们建议从源代码构建它。

我已经按照 PyQt4 Download 上的建议安装了 SIP。

我还下载了 PyQt 4 并解压了它。现在当我运行宁python configure.py --verbose,我得到

Stanislaw@home:PyQt4_gpl_mac-4.12.3 (master)*$ python configure.py --verbose
Determining the layout of your Qt installation...
/usr/local/bin/qmake -spec macx-g++ -o qtdirs.mk qtdirs.pro
make -f qtdirs.mk
g++ -c -pipe -O2 -arch x86_64 -Xarch_x86_64 -mmacosx-version-min=10.5 -Wall -W -DQT_NO_DEBUG -DQT_CORE_LIB -DQT_SHARED -I/usr/local/etc/qt4/mkspecs/macx-g++ -I. -I/usr/local/Cellar/qt@4/4.8.7_6/lib/QtCore.framework/Versions/4/Headers -I/usr/local/Cellar/qt@4/4.8.7_6/lib/QtCore.framework/Versions/4/Headers -I/usr/local/include -I. -F/usr/local/lib -o qtdirs.o qtdirs.cpp
warning: include path for stdlibc++ headers not found; pass '-stdlib=libc++' on the command line to use the libc++ standard library instead [-Wstdlibcxx-not-found]
...
/usr/local/lib/QtCore.framework/Headers/qglobal.h:68:10: fatal error: 'algorithm' file not found
#include <algorithm>
         ^~~~~~~~~~~

我对 Qt/qmake 没有任何经验,但我猜想这个旧版本的 PyQt 没有自行配置以正确使用 macOS 的基于 Clang 的 C++ 工具链。

我会继续挖掘,但我也想知道是否存在针对此问题的简单解决方案。

这可能不是 best/right 构建 PyQt 4 的方法,但我构建了它,现在我的程序是 运行.

以下解决方案需要安装 Qt。我installed它与

brew install cartr/qt4/pyqt@4

现在是 PyQt 部分。

PyQt 安装包括 3 个步骤:

 python configure.py
 make
 make install

使 python configure.py 步骤有效 我必须在 configure.py 文件中更改它:

-qt_macx_spec = 'macx-g++'
+qt_macx_spec = 'macx-llvm'

在第二步,当运行 make时,我得到了和以前一样的错误,但这次它来自生成的Makefiles。事实证明,将 -mmacosx-version-min=10.5 标志中的版本增加到 -mmacosx-version-min=10.10(通过替换所有生成的 Makefile 中的这一行)可以使错误消失。

(我对此的解释是,更高版本的 macOS SDK 不使用 GCC 的旧 C++ 标准库,而是使用其较新的 Clang C++ 工具链的 C++ 库。)

在那之后,当 运行 我的基于 PyQt4 的应用程序时,我点击了:

ImportError: No module named sip

已找到解决方案here:我不得不使用附加标志重建 SIP:

cd sip-4.19.22
# `make clean` is important otherwise rebuilding will not work
# your program might complain with
# "ValueError: PyCapsule_GetPointer called with incorrect name"
make clean 
python configure.py --sip-module PyQt4.sip