2011-10-16 44 views
1

Possible Duplicate:
C++: undefined reference to static class member克++未定義參考靜態成員變量

我編譯此使用g ++以及一個生成文件。在G ++版本是4.1.2 20080704.

下面是簡化的代碼仍然包含錯誤:

#ifdef __cplusplus 
extern "C" 
{ 
#endif 

class MyClass 
    { 
    public: 
    MyClass() {}; 
    MyClass& operator=(MyClass&); 
    static MyClass& instance() { return log; }; 

    private: 
    static MyClass log; 

    }; 

//MyClass MyClass::log; 

int main() 
{ 
    MyClass& myClass = MyClass::instance(); 
    return 0; 
} 

#ifdef __cplusplus 
} //extern "C" 
#endif 

當我與「G ++ MyClass.cpp」我得到這個錯誤: 「編譯功能MyClass :: Instance()':MyClass.cpp:'未定義的引用MyClass :: log

如果我用'g ++ MyClass.cpp -c'編譯它構建目標文件,但鏈接該文件會導致相同的錯誤在鏈接期間,我嘗試在類定義之後用「MyClass MyClass :: log;」定義靜態變量,但由於它使用C編譯,所以我不認爲t帽子會工作。它給出了一個錯誤消息「與C鏈接的新定義的C++鏈接衝突」

我不知道如何解決這個問題,我幾天來一直在反對這個問題。任何幫助是極大的讚賞。

額外背景資料:

這源自最初的CPP文件包含「必須使用C函數的語法Simulink中定義的函數。」我想盡可能少地改變現有的代碼。我不是C程序員,所以我對這裏的理解有限。我知道這些函數正在與simulink一起使用,並且所有內容都是在matlab編譯器中編譯的。我們試圖導出創建的simulink,以便我們可以將它集成到另一個程序中,但這是我們編譯的許多問題之一。希望這提供了一些更好的背景資料

+4

爲什麼你會嘗試在第一個地方給C類聯繫..? – ildjarn

+0

源自此的原始cpp文件包含「必須使用C函數語法的Simulink定義函數」。我想盡可能少地改變現有的代碼。我不是C程序員,所以我對這裏的理解有限。我知道這些函數正在與simulink一起使用,並且所有內容都是在matlab編譯器中編譯的。我們試圖導出創建的simulink,以便我們可以將它集成到另一個程序中,但這是我們編譯的許多問題之一。希望能給出一些更好的背景信息。 – Spencer

+0

這不是一個重複的問題 - extern「C」連接的問題是新的。投票重新開放。 – TonyK

回答

2

MyClass::log在類定義的聲明得到C++聯動儘管extern "C",因爲靜態類成員只需在C不存在。但由於某種原因,類定義之外的MyClass::log的定義得到了C鏈接,這對我來說沒有多大意義。

但是,您可以通過從extern "C"範圍中刪除定義來避開該問題。你爲什麼在C++文件中使用extern "C"

+0

工作!謝謝。 – Spencer