为啥 python 3.2 的 Python.h 必须首先与 Qt4 一起包含

Posted

技术标签:

【中文标题】为啥 python 3.2 的 Python.h 必须首先与 Qt4 一起包含【英文标题】:Why Python.h of python 3.2 must be included as first together with Qt4为什么 python 3.2 的 Python.h 必须首先与 Qt4 一起包含 【发布时间】:2013-11-30 12:25:14 【问题描述】:

我有一个 qt 应用程序,我想在其中实现 python 解释器,以便可以使用 python 脚本对其进行扩展。虽然这适用于常规 C++ 应用程序,包括 Python.h,即使对于最简单的空 Qt4 项目也总是会导致:

g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -DQT_WEBKIT -DQT_NO_DEBUG -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++-64 -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4 -I/usr/include/python3.2mu -I. -o main.o main.cpp
In file included from /usr/include/python3.2mu/Python.h:8:0,
                 from main.cpp:16:
/usr/include/python3.2mu/pyconfig.h:1182:0: warning: "_POSIX_C_SOURCE" redefined [enabled by default]
/usr/include/features.h:164:0: note: this is the location of the previous definition
/usr/include/python3.2mu/pyconfig.h:1204:0: warning: "_XOPEN_SOURCE" redefined [enabled by default]
/usr/include/features.h:166:0: note: this is the location of the previous definition
In file included from /usr/include/python3.2mu/Python.h:67:0,
                 from main.cpp:16:
/usr/include/python3.2mu/object.h:402:23: error: expected unqualified-id before ‘;’ token
make: *** [main.o] Error 1

我只在我的 .pro 文件中实现了这个:

INCLUDEPATH += "/usr/include/python3.2"

现在任何时候都可以

#include <Python.h>

在任何 .h 文件中,它都会使其无法构建。这是为什么呢?

注意:这一切都适用于 python 2.7,只是 python 3x 不起作用

编辑:我发现,当我将 Python.h 作为第一个文件包含在 Qt 之前,它可以工作,这是 python 中的错误吗?他们是否缺少一些安全卫士?

【问题讨论】:

【参考方案1】:

Python C-API 的documentation 声明:

注意由于 Python 可能会定义一些预处理器定义,这些定义会影响某些系统上的标准头文件,因此您必须在包含任何标准头文件之前包含 Python.h。

很可能某些 Qt 标头包含标准标头(从您收到的错误中可以看出,它确实包含 /usr/include/features.h 或示例),因此应将 #include &lt;Python.h&gt; 放在 Qt 标头之前。事实上,它通常应该放在任何其他包含语句之前。

请注意,Python 2.7 也是如此。如果不同的包含顺序适用于 Python 2.7,那么您很幸运。

【讨论】:

这听起来太自私了,如果每个开发者都这么想的话,我们不能使用超过 1 个外部库,因为它们都需要先包含在内。他们为什么不保护这个? @Petr 我最终不知道这个问题的答案,我并不是说这是最优的。但要记住的一件事是,他们不会简单地故意制造名称冲突。我相信上面的文字意味着它们有意影响某些标准标题。 哪个坏了。他们应该要求用户在包含 Python.h 之前将相关的 _XOPEN_SOURCE_POSIX_SOURCE 宏定义为足够的值,而不是重新定义它们。

以上是关于为啥 python 3.2 的 Python.h 必须首先与 Qt4 一起包含的主要内容,如果未能解决你的问题,请参考以下文章

为啥 PyObject_Print 会崩溃?

Ubuntu,致命错误:Python.h:没有这样的文件或目录#include <Python.h>

Flex 4.6 - Air 3.2 - 为啥用偏移量绘制图形?

FB iOS SDK 3.2:为啥我需要访问令牌来记录转换像素?

Kohana 3.2 - ORM 的 pk() 方法在 save() (create()) 之后返回 false - 为啥?

为啥 OpenGL 的 glDrawArrays() 在核心配置文件 3.2 下失败并显示 GL_INVALID_OPERATION 而不是 3.3 或 4.2?