在 Qt 应用程序中包含 Python.h 会导致对 Qt 函数的未定义引用

Posted

技术标签:

【中文标题】在 Qt 应用程序中包含 Python.h 会导致对 Qt 函数的未定义引用【英文标题】:Including Python.h in Qt application causes undefined reference to Qt functions 【发布时间】:2018-12-16 12:37:36 【问题描述】:

我想在我的项目中包含Python.h(来自我的 Anaconda 文件夹中的 Python 发行版)以调用 Python 脚本。当我不包含 python 时,程序编译得很好。但是一旦我这样做,我就会得到undefined reference Qt 类中实现的函数的错误(所以不是我自己的函数!)。我想包含的python版本是3.5.5

最让我困惑的部分是undefined reference to QJsonValue::toString()。这个方法是内联实现的,怎么找不到它的实现呢?根据 QtCreator 的说法,问题源于试图调用此函数的编译对象。

这是一个最低限度(不)工作的例子:

.pro 文件:

QT -= gui
CONFIG += c++11 console no_keywords
SOURCES += main.cpp
INCLUDEPATH += path to python include
LIBS += -Lpath to python lib -lpython3.5m

还有main.cpp文件:

#include <Python.h>
#include <QCoreApplication>
#include <QJsonValue>

int main(int argc, char *argv[])

    QCoreApplication a(argc, argv);
    PyObject *obj;
    QJsonValue value;
    value.toString();
    return a.exec();

更新: 似乎包含来自 Anaconda 的 Python 是导致问题的原因。当我删除 LIBS += -Lpath to python lib -lpython3.5m 时,它编译得很好。当我删除 INCLUDEPATH += path to python include 但保留另一行时,我收到以下错误:

/user/build-TestProject-Qt_5_9-Debug/TestProject: /user/anaconda3/lib/libQt5Core.so.5: version `Qt_5.9' not found (required by /user/build-TestProject-Qt_5_9-Debug/TestProject)

【问题讨论】:

你有没有在#include &lt;QJsonValue&gt;之后尝试#include &lt;Python.h&gt;? Python 标头可能会弄乱预处理器。 是的,也没有运气。 QtCreator 是一个 IDE,所以“根据 QtCreator”实际上应该是“根据链接器控制台输出”。问题可能是“Python.h”污染了全局命名空间。尝试在其中编译带有“Python.h”的东西,并且在源代码中没有对 Qt 的引用,即将“mypy.cpp”添加到项目中,并在那里使用一些 Python API。在“mypy.h”中向它公开接口,然后从main() 使用它。 当然你是对的,它是链接器的输出。我其实知道不知道我为什么要写 QtCreator。不幸的是,你的想法没有奏效。我什至尝试不导入导入 Python.h 的类。 main.cpp 仍然无法编译。显然这是 .pro 文件中的两行(见编辑)。 好的,我解决了。问题是 QtCreator 想要像我的工具包中定义的 qmake 5.9,但包括来自 Anaconda 的 Python.h 使用来自 Anaconda 的 bin 文件夹的 qmake 5.6。我添加了 5.6 套件,它现在可以工作了。尽管这似乎是一个丑陋的解决方案。我应该编辑和回答问题还是删除它? 【参考方案1】:

问题是由使用 Anaconda 的 Python 发行版引起的。将项目设置为包含 Python 会导致 QtCreator 使用 Anaconda 的 qmake 而不是已安装的版本。如果您可以使用 Qt 5.6,这是 Anaconda 中 Qt 的当前版本,请使用 Anaconda 的qmake 创建一个 Kit,然后程序再次编译。

如果您需要更新版本的 Qt,您可以添加该行

-L/user/Qt5.9.5/5.9.5/gcc_64/lib -lQt5Core

到您的 .pro 文件。将其调整为您的 Qt 版本以及您需要的库。这不是一个很好的解决方案,因为您需要在想要切换版本时调整 .pro 文件,但这是我所知道的唯一解决方案。

【讨论】:

以上是关于在 Qt 应用程序中包含 Python.h 会导致对 Qt 函数的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章

在 Qt Creator App 中包含 Web 查看器

如何在 Mac OS 的发布版本中包含 Qt 库?

不能在 Visual Studio 中包含 Python.h

如何在 Qt 5.4 应用程序中包含 QtScript 模块

qt:在一个 gui 窗口中包含 opencv 和 opengl 子窗口

在组件中包含部分会导致重复的 css