在 Qt 应用程序中包含 Python.h 会导致对 Qt 函数的未定义引用
Including Python.h in Qt application causes undefined reference to Qt functions
我想在我的项目中包含 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)
该问题是由于使用 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 文件,但这是我所知道的唯一解决方案。
我想在我的项目中包含 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)
该问题是由于使用 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 文件,但这是我所知道的唯一解决方案。