如何使用 Qt Creator 将 C++ 头文件添加到 Qt 项目
Posted
技术标签:
【中文标题】如何使用 Qt Creator 将 C++ 头文件添加到 Qt 项目【英文标题】:How to add C++ header file to Qt project with Qt Creator 【发布时间】:2016-03-31 13:16:41 【问题描述】:我想开发一个小型 Qt Widget 应用程序,它可以从 mysql 数据库中获取用于绘图的数据。我有一些我想在 C++ 头文件中使用的函数,该文件是我为一个较旧的 C++ 项目编写的。我想利用这个头文件中的函数,但我没有设法将这个头文件正确地添加到我的 Qt 项目中。
在 Qt Creator 中,我使用“添加现有文件”对话框添加头文件,我还告诉 Qt Creator 使用我的头文件中使用的 MySQL_connector C++ 库。 .pro 文件现在看起来像这样:
#-------------------------------------------------
#
# Project created by QtCreator 2016-03-31T14:12:08
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = dummy
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp \
Level2Snapshot.cpp
HEADERS += mainwindow.h \
Level2Snapshot.h \
MySQL_Operations.h
FORMS += mainwindow.ui
unix:!macx: LIBS += -L$$PWD/../../../../usr/lib/ -lmysqlcppconn
INCLUDEPATH += $$PWD/../../../../usr/include
DEPENDPATH += $$PWD/../../../../usr/include
现在,当我想在我的 MainWindow 源文件中初始化必要的 sql 对象时,我在编译期间收到“未声明”错误。
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
ui->setupUi(this);
sql::Driver *driver;
sql::Connection *con;
MainWindow::~MainWindow()
delete ui;
我可以通过将包含所有 MySQL 相关内容的“MySQL_Operations.h”包含到源文件中来使其工作:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "MySQL_Operations.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
ui->setupUi(this);
sql::Driver *driver;
sql::Connection *con;
MainWindow::~MainWindow()
delete ui;
但这对我没有帮助,因为我需要在 MainWindow.h 中包含头文件,因为我想在那里声明将 MySQL Connection 作为参数的方法。比如这样的:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "MySQL_Operations.h"
namespace Ui
class MainWindow;
class MainWindow : public QMainWindow
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void print_time_span(sql::Connection *con, std::string database, std::string table);
private:
Ui::MainWindow *ui;
;
#endif // MAINWINDOW_H
这样做,我得到 MySQL_Operations.h 中实现的所有功能的“多重定义”错误。我知道在多重定义问题上也有人问过类似的问题,但没有任何帮助。显然编译器知道我的头文件的内容,因为否则我不明白它是如何抱怨多个定义的。但没有明确地将 MySQL_Operations.h 添加到 #include 语句中,而只是添加到 .pro 文件中,在使用 Qt Creator 创建的 Qt 项目中似乎是如何完成的,这是行不通的。
我在头文件中的 MySQL 方面投入了大量精力,我真的很想使用它,而不是 Qt 提供的 MySQL 工具。因此,非常感谢任何帮助。我是 Qt 新手,可能不了解构建过程的一些要点。因此,即使是最简单的建议也不要犹豫。
非常感谢! 尼尔斯
感谢到目前为止的回答。我将标题减少到最低限度,它仍然会重现错误。这是文件:
#ifndef MYSQL_OPERATIONS_H
#define MYSQL_OPERATIONS_H
#include "mysql_connection.h"
#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
#include <cppconn/prepared_statement.h>
#include <vector>
namespace dom
void print_time_span(sql::Connection *con, std::string database, std::string table)
sql::Statement *stmt;
sql::ResultSet *res;
std::string use_database = "USE " + database;
stmt = con->createStatement();
stmt->execute(use_database);
res = stmt->executeQuery("SELECT MAX(Time) AS Time FROM test");
res->next();
std::string endtime = res->getString("Time");
res = stmt->executeQuery("SELECT MIN(Time) AS Time FROM test");
res->next();
std::string starttime = res->getString("Time");
std::cout << "First entry in " <<
database <<
"." <<
table <<
" is from " << starttime <<
" and ranges to " <<
endtime << "." << std::endl;
delete res;
delete stmt;
#endif /* MYSQL_OPERATIONS_H */
这只是一个简单的查询。在 MainWindow.h 中包含头文件时添加时遇到的错误是:
/home/niels/Programmierung/dummy/MySQL_Operations.h:28: Fehler: multiple definition of `dom::print_time_span(sql::Connection*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
我两次收到此错误。
【问题讨论】:
你能显示头文件,以及错误吗?另外,您是否重新运行了 qmake(Qt Creator 中的Build -> Run qmake
选项)并重建了项目?
你在"MySQL_Operations.h"
头文件中做了什么?你得到什么多个定义?它有include guards吗?
@Niels - 此外,如果您已将其包含在 mainwindow.h
中,则您不必将 #include
文件包含在 mainwindow.cpp
中,因为 mainwindow.h
包含在 mainwindow.cpp
中。
这并不是qt特有的,所有的头文件都应该有保护。 #ifndef MYHEADERFILE #define MYHEADERFILE ...stuff #endif 这听起来像你的问题。
你运行过 QMake 吗??? 99% 的人问这样的问题,他们只是没有运行 QMake
【参考方案1】:
真正帮助我的是这篇文章:https://***.com/a/20679534/4583985
减少命名空间名称后,“多重定义”错误消失了。也许有人可以解释它实际上做了什么。
最好的 尼尔斯
【讨论】:
以上是关于如何使用 Qt Creator 将 C++ 头文件添加到 Qt 项目的主要内容,如果未能解决你的问题,请参考以下文章