【发布时间】: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 += -L{path 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 += -L{path 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 套件,它现在可以工作了。尽管这似乎是一个丑陋的解决方案。我应该编辑和回答问题还是删除它?
标签: python c++ qt anaconda python-3.5