2013-03-22 70 views
2

這可能是次要的,但我很好奇原因。編譯器如何對待extern變量

這來自我的朋友的做法代碼:

#include <iostream> 

using namespace std ; 
extern int* PPPP; 

void main(){ 
    cout<<"*PPPP"<<*PPPP<<endl; 
} 

到錯誤,PPPP實際上是宣告行不通的。但好奇的是,我們可以將它編譯成一個靜態庫。 但是,我們不能使這成爲一個DLL,有鏈接錯誤(無法解析的外部sysmbol pppp)

我們猜測這是因爲當做一個靜態庫時,名稱PPPP(雖然extern)有一個空間無論如何,在內存中,所以,在這個問題上沒有問題。

我們對此一點也不確定。我們希望聽到更多關於此的更準確的信息。

在此先感謝。

+0

只是好奇,但爲什麼與'主要'的源在一個庫,靜態或不是?我希望這是一個可執行文件。 – 2013-03-22 09:05:16

回答

5

靜態庫旨在鏈接到另一組文件,因此它可以包含未定義的符號,因爲這些符號將在稍後階段解決(或者不會,在這種情況下,您會收到鏈接器錯誤)。

然而,DLL就像一個可執行文件,需要完全鏈接,因此不能包含任何未定義的引用。

+0

感謝Joachim,你的回答解決了我的難題。 – 2013-03-22 08:04:09

1

我猜測,當它被製作成一個靜態庫時,鏈接器會假定任何未解析的符號在完全鏈接時都可用。

如果您將該靜態庫鏈接到某個未定義名爲PPPP的符號的程序,它將失敗,並顯示鏈接器錯誤。

0

當你說:

extern int* PPPP; 

你允諾PPPP位於另一個翻譯單元編譯器。

鏈接器將嘗試在給定的對象文件和庫中找到PPPP,如果不能,它會發出錯誤。