在 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
我正在尝试构建 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