2012-04-05 64 views
3

我必須在我的C++應用程序中使用一個醜陋的C庫。在下面的解釋中,我將稱它爲UglyLib。我成功地將UglyLib編譯爲一個靜態鏈接庫。 在文件ugly.h UglyLib使用一個外部變量:extern變量在靜態庫內鏈接失敗

文件ugly.h:

extern SomeStruct_type somestruct; 

的變量被定義(並且也使用)在另一個文件。我會把它稱爲另一個。

文件anotherugly.c:

SomeStruct_type somestruct; 

我的C++申請是基於一個通用的模板庫(TemplateLib)和應用程序本身由主窗口GUI代碼和靜態鏈接的應用程序庫組成與主窗口代碼。我將調用這個靜態鏈接庫ApplicationLib。

TemplateLib包含一個templatelibfile.h,它使用uglyLib公開的extern變量some​​Struct導出函數foo。

文件templatelibfile.h:

#include<ugly.h> 
... 
void foo() 
{ 
... 
do something with somestruct 
... 
} 

富功能由appllibfile.h包含在靜態鏈接ApplicationLib使用。

文件appllibfile.h:

#include<templatelibfile.h> 
... 
void applfoo() 
{ 
... 
foo(); 
... 
} 

主窗口應用程序包括appllibfile.h

文件main.cpp中:

#include<appllibfile.h> 
... 
int main() 
{ 
... 
applfoo(); 
... 
return 0; 
} 

在VS2008當我嘗試編譯主窗口應用程序,微軟鏈接器給我這個錯誤

錯誤LNK2001:無法解析的外部符號 「結構SomeStruct_type somestruct」(?somestruct @@ 3USomeStruct_type @@ A)

如果我在外部變量的templatefile.ha新定義添加編譯器停下來抱怨。

文件templatelibfile.h:

#include<ugly.h> 
SomeStruct_type somestruct 
... 
void foo() 
{ 
... 
do something with somestruct; 
... 
} 

我會希望避免它,因爲我不知道這是否是正確的事情(我不想冒險到改變UglyLib的語義,重新定義somestruct變量的不同實例)。 你有一些建議,以避免重新定義somestruct外部變量的鏈接問題? 非常感謝!

回答

4

這可能是因爲C++編譯器所做的名稱改變。由於anotherugly.c是C源代碼(大概是使用C編譯器編譯的),因此符號somestruct將被暴露而不會被破壞。當您用C++編譯器編譯其餘文件時,鏈接程序會查找不存在的重名名稱。

我覺得圍繞在ugly.h中的聲明extern "C"可能會解決問題。

+0

非常感謝它,它完美的作品! – 2012-04-05 08:38:25

+0

@GuidoRanzuglia:你應該點擊左邊的勾號接受答案。 – 2012-04-05 08:42:28