我想在项目中包括Python.h
(来自Anaconda文件夹中的Python发行版)以调用python脚本。当我不包含python时,程序可以正常编译。但是,一旦我这样做,我就会在Qt类中实现的函数遇到undefined reference
错误(而不是我自己的函数!)。我想包含的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)
答案 0 :(得分:1)
此问题是由使用Anaconda的Python发行版引起的。将项目设置为包括Python会使QtCreator使用Anaconda的qmake
而不是已安装的版本。如果您可以使用Anaconda中Qt的当前版本Qt 5.6,请使用Anaconda的qmake
创建一个Kit,然后再次编译该程序。
如果您需要更新版本的Qt,可以添加该行
-L/{user}/Qt5.9.5/5.9.5/gcc_64/lib -lQt5Core
到您的.pro文件。将其调整为您的Qt版本以及所需的库。这并不是一个很好的解决方案,因为每当您要切换版本时都需要调整.pro文件,但这是我所知道的唯一解决方案。