2013-03-22 74 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,如果不能,它会发出错误。