如何使用 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 -&gt; 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 项目的主要内容,如果未能解决你的问题,请参考以下文章

在哪里告诉 Qt Creator 搜索用于自动完成的头文件

如何在Qt Creator中添加库文件和头文件目录

qt creator 中读写.mat文件

qt creator 使用Ui文件的问题

qt creator 中如何使用c++库

Qt Creator 将文件添加到 C++ 项目问题