2

这可能是次要的,但我很好奇原因。

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

#include <iostream>

using namespace std ;
extern int* PPPP;

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

错误地,PPPP 实际上没有在任何地方宣布。但奇怪的是,我们可以将它编译成一个静态库。但是,我们不能把它做成一个dll,有链接错误(未解决的外部sysmbol pppp)

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

我们对此完全不确定。我们希望听到更多和准确的信息。

提前致谢。

4

3 回答 3

5

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

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

于 2013-03-22T07:18:51.363 回答
1

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

如果您将该静态库链接到某个没有名为PPPPdefined 的符号的程序,它将因链接器错误而失败。

于 2013-03-22T07:18:17.473 回答
0

当你说:

extern int* PPPP;

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

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

于 2013-03-22T07:18:54.897 回答