web-dev-qa-db-ja.com

静的変数リンクエラー

MacでC++コードを書いています。コンパイル時にこのエラーが発生するのはなぜですか?:

アーキテクチャi386の未定義シンボル: "Log :: theString"、参照元:libTest.a(Log.o)ldのLog :: method(std :: string)ld:アーキテクチャi386のシンボルが見つかりませんclang:エラー:リンカコマンドが終了コード1で失敗しました(呼び出しを表示するには-vを使用します)

コードが間違っているのか、Xcodeに追加のフラグを追加する必要があるのか​​はわかりません。私の現在のXCode構成は、「静的ライブラリ」プロジェクトのデフォルト構成です。

私のコード:

Log.h ------------

#include <iostream>
#include <string>

using namespace std;

class Log{
public:
    static void method(string arg);
private:
    static string theString ;
};

Log.cpp ----

#include "Log.h"
#include <ostream>

void Log::method(string arg){
    theString = "hola";
    cout   << theString << endl; 
}

この方法で、テストコードから「メソッド」を呼び出しています。「Log :: method( "asd"):」

ご協力いただきありがとうございます。

63
subzero

cppファイルで静的を定義する必要があります。

Log.cpp

#include "Log.h"
#include <ostream>

string Log::theString;  // <---- define static here

void Log::method(string arg){
    theString = "hola";
    cout   << theString << endl; 
}

ヘッダーからusing namespace std;も削除する必要があります。あなたがまだできる間、習慣に入りなさい。これにより、ヘッダーをインクルードする場所はどこでもstdでグローバル名前空間が汚染されます。

81
Luchian Grigore

static string theString;を宣言しましたが、定義していません。

含める

string Log::theString;

cppファイルに

16
Lol4t0