在 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 <QJsonValue>
之后尝试#include <Python.h>
? 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 函数的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章
不能在 Visual Studio 中包含 Python.h
如何在 Qt 5.4 应用程序中包含 QtScript 模块