我必須在我的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變量someStruct導出函數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外部變量的鏈接問題? 非常感謝!
非常感謝它,它完美的作品! – 2012-04-05 08:38:25
@GuidoRanzuglia:你應該點擊左邊的勾號接受答案。 – 2012-04-05 08:42:28