2016-04-13 22 views
0

プロジェクトのリンクに問題があります。私は3つの異なるプロジェクト間で使用できる共有ライブラリを作成しようとしています。このライブラリは、XMLファイルの解析と、これらのXMLファイルのオブジェクトによる一般的な処理に使用されます。QTスタティックライブラリ未定義静的変数への参照

影響を受ける最小限の例を示します。ライブラリプロジェクトはこれらのファイルで構成されています

============= Library.cpp ============= 
#include "library.h" 

Library::Library(QString name){ 
this->name = name; 
} 

============= Library.h ============= 
#ifndef LIBRARY_H 
#define LIBRARY_H 

#include <QString> 

class Library 
{ 

public: 
    Library(QString name); 

private: 
    static QString name; 
}; 
#endif // LIBRARY_H 

============= Library.pro ============= 
QT  -= gui 
TARGET = Library 
TEMPLATE = lib 
CONFIG += staticlib 
SOURCES += library.cpp 
HEADERS += library.h 
unix { 
    target.path = /usr/lib 
    INSTALLS += target 
} 

メインアプリケーションはこれらのファイルで作成されています。ここで

============= main.c ============= 
#include <QCoreApplication> 
#include "library.h" 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
    Library lib("MyLib"); 

    return a.exec(); 
} 

============= Application.pro ============= 
QT += core 
QT -= gui 

TARGET = Application 
CONFIG += console 
CONFIG -= app_bundle 
TEMPLATE = app 
SOURCES += main.cpp 
SRCDIR = $$IN_PWD/../Library 
INCLUDEPATH += $$SRCDIR 
SRCDIR = $$IN_PWD/../Library 
INCLUDEPATH += $$SRCDIR 

LIBDIR = $$IN_PWD/../build-Library-Desktop_Qt_5_5_1_GCC_64bit-Ladění/libLibrary.a 
LIBS += $$LIBDIR 

私は非静的変数にLibrary.hで静的 QStringの名前を変更すると、リンカ

g++ -c -pipe -g -Wall -W -D_REENTRANT -fPIC -DQT_CORE_LIB -I../Application -I. -I../Library -I../Library -I../../../Qt/5.5/gcc_64/include -I../../../Qt/5.5/gcc_64/include/QtCore -I. -I../../../Qt/5.5/gcc_64/mkspecs/linux-g++ -o main.o ../Application/main.cpp 

g++ -Wl,-rpath,/home/mint/Qt/5.5/gcc_64 -Wl,-rpath,/home/mint/Qt/5.5/gcc_64/lib -o Application main.o /home/mint/Development/test/Application/../build-Library-Desktop_Qt_5_5_1_GCC_64bit-Ladění/libLibrary.a -L/home/mint/Qt/5.5/gcc_64/lib -lQt5Core -lpthread 

/home/mint/Development/test/Application/../build-Library-Desktop_Qt_5_5_1_GCC_64bit-Ladění/libLibrary.a(library.o): In function `Library::Library(QString)': 

Makefile:214: recipe for target 'Application' failed 

/home/mint/Development/test/build-Library-Desktop_Qt_5_5_1_GCC_64bit-Ladění/../Library/library.cpp:6: undefined reference to `Library::name' 
collect2: error: ld returned 1 exit status 

の出力は、その後、すべてがOKです。それはその後リンクすることができます。私は、プロジェクトファイルが正しくセットアップされていると思いますが、何が欠けていますか?

答えて

1

staticメンバ変数は、他のstatic変数からとても異なる(基本的にグローバルエクスポートされた「クラス変数」であっても反対の意味で、あなたはに静的ファイルスコープ変数を作るそれらをグローバルに輸出されてを避けます)。

.hファイルでは、変数の宣言しかありません。この種の変数がどこかに存在すると宣言します。

しかし実際にはそれを実際にするには、と定義する必要があります。したがって、あなたは1つの.cppファイルにこれを追加する必要があります(おそらく)あなたはそれをインスタンスが作成されるたびに変更するべきではありませんので

QString Library::name = QStringLiteral("initial value"); 

さらに、それはクラス変数は、あるので、あなたのconsturctorだけで次のようになります。

あなたのコンストラクタでコードを置き換えるために(かなりおそらく main()、どこか別の場所からそれを初期化したい場合は
Library::Library() { 
} 

、単にそれに割り当てる:

Library::name = whatever; 

あなたが実際に(クラスの各インスタンス/オブジェクトは独自のコピーを持っている)インスタンス変数としてそれを持っているしたい場合は、その後、ちょうど.hファイルで定義からstaticを削除します。

また、グローバル変数(staticクラス変数を含む)では、初期化順序に注意する必要があります。それらはグローバル変数でもあり、すべての問題があります。したがって、実際にが必要ない場合は、が必要です。使用しないでください。

+0

このトピックの周りの理論についても、あなたの助けてくれてありがとう!実際にはシングルトンを作成したいので、静的はQString型ではありません。 QStringは単に説明のためのものでした。とにかくあなたのサポートに感謝します。 – user2336793

+0

@ user2336793シングルトンについては、[この質問と回答](http://stackoverflow.com/q/1008019/1717300)(または他のリソースについてはgoogle)を読むべきでしょう。シングルトンや、さまざまな種類の問題を抱える方法がいくつかあります。 – hyde

0

C++で静的メンバーを定義し、クラス宣言の外で初期化する必要があります。 C++で

============= Library.h ============= 
#ifndef LIBRARY_H 
#define LIBRARY_H 

#include <QString> 

class Library 
{ 
public: 
    Library(QString name); 

private: 
    static QString name;// declare 
}; 
#endif // LIBRARY_H  

============= Library.cpp ============= 
#include "library.h" 

//add this line if name is static member of Library 
QString Library::name;// define and initialize 

//you can also initialize it to other value like: 
//QString Library::name = "banana!"; 

Library::Library(QString name){ 
    this->name = name; 
} 
+0

ありがとうございました。これは機能します。 – user2336793

+0

このコードは質問に答えるかもしれませんが、理由や質問にどのように回答するかに関する追加の文脈を提供することで、長期的な価値が大幅に向上します。あなたの答えを[編集]して、説明を加えてください。 – CodeMouse92

+0

@ JasonMc92申し訳ありません。私は昨日眠っていた。回答が編集されました。ご報告いただきありがとうございます。 – Daniel

関連する問題