编译器如何处理外部变量

时间:2013-03-22 07:15:48

标签: c++ dll extern

这可能很小,但我很好奇。

这来自我朋友的练习代码:

#include <iostream>

using namespace std ;
extern int* PPPP;

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

错误地,PPPP实际上是无处声明的。 但奇怪的是我们可以将其编译成静态库。 但是,我们不能把它变成一个dll,有链接错误(未解析的外部sysmbol pppp)

我们猜测是因为在创建一个静态库时,PPPP(虽然extern)这个名称在内存中确实有一个空格,所以,这没有问题。

我们根本不确定这一点。我们希望能够听到更多更准确的信息。

提前致谢。

3 个答案:

答案 0 :(得分:5)

静态库旨在链接到另一组文件,因此它可以包含未定义的符号,因为这些符号将在稍后阶段解析(或者不会,在这种情况下会出现链接器错误)。

然而,DLL就像可执行文件一样,需要完全链接,因此不能包含任何未定义的引用。

答案 1 :(得分:1)

我猜测当它被制作成静态库时,链接器会假定在完全链接时任何未解析的符号都可用。

如果将静态库链接到某个程序而没有定义名为PPPP的符号,则它会因链接器错误而失败。

答案 2 :(得分:0)

当你说:

extern int* PPPP;

您承诺PPPP位于另一个翻译单元的编译器。

链接器将尝试在它给出的目标文件和库中找到PPPP,如果不能,则会发出错误。