MySQLデータベースからプロットするためのデータを取得する小さなQtウィジェットアプリケーションを開発したいと思います。私は、古いC++プロジェクト用に書いたC++ヘッダーファイルで使用したい機能をいくつか持っています。このヘッダファイルの中で関数を利用したいのですが、このヘッダをQtプロジェクトに適切に追加することはできません。Qt CreatorでQtプロジェクトにC++ヘッダファイルを追加するには
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
を今、私は私のメイン・ウィンドウソース・ファイルに必要な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;
}
をしかし、それdoesntのは、私を助けて私がする必要があるため、 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で実装されているすべてのfuntionsのための「複数の定義」エラーが発生します。私は、同様の質問が複数の定義の問題について質問されていることを知っていますが、何も私を助けませんでした。明らかにコンパイラは私のヘッダファイルの内容を知っています。なぜなら、そうでなければ、複数の定義についてそれがどのように不平を言うのか理解できないからです。しかし、MySQL_Operations.hを#includeステートメントに明示的に追加するのではなく、.proファイルだけに追加するのではなく、Qt Creatorで作成されたQtプロジェクトでどのように処理されているように見えますか。
私は、私のヘッダファイルにあるMySQLのものに多くの労力を費やしました。Qtが提供するMySQLツールの代わりに、これを本当に使いたいと思います。 Therforeはどんな助けも非常に高く評価されます。私はQtが新しく、ビルドプロセスのいくつかの重要なことを認識していないかもしれません。だから、私には一番簡単なアドバイスさえ躊躇しないでください。
ありがとう! Niels
これまでの回答に感謝します。ヘッダーを最小限に抑え、エラーを再現しました。ファイルは次のとおりです。
これは単なる単純なクエリです。 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'オプション)を再実行して、プロジェクトを再構築しましたか? – owacoder
そして、あなたの '' MySQL_Operations.h "'ヘッダファイルで何をやっていますか? *何を複数定義していますか?それに[ガードを含む](https://en.wikipedia.org/wiki/Include_guard)がありますか? –
@Niels - 'mainwindow.h'が' mainwindow.cpp'に含まれているので、 'mainwindow.h'にすでにインクルードしていれば' mainwindow.cpp'にファイルを '#include 'する必要はありません。 – owacoder