这可能很小,但我很好奇。
这来自我朋友的练习代码:
#include <iostream>
using namespace std ;
extern int* PPPP;
void main(){
cout<<"*PPPP"<<*PPPP<<endl;
}
错误地,PPPP实际上是无处声明的。 但奇怪的是我们可以将其编译成静态库。 但是,我们不能把它变成一个dll,有链接错误(未解析的外部sysmbol pppp)
我们猜测是因为在创建一个静态库时,PPPP(虽然extern)这个名称在内存中确实有一个空格,所以,这没有问题。
我们根本不确定这一点。我们希望能够听到更多更准确的信息。
提前致谢。
答案 0 :(得分:5)
静态库旨在链接到另一组文件,因此它可以包含未定义的符号,因为这些符号将在稍后阶段解析(或者不会,在这种情况下会出现链接器错误)。
然而,DLL就像可执行文件一样,需要完全链接,因此不能包含任何未定义的引用。
答案 1 :(得分:1)
我猜测当它被制作成静态库时,链接器会假定在完全链接时任何未解析的符号都可用。
如果将静态库链接到某个程序而没有定义名为PPPP
的符号,则它会因链接器错误而失败。
答案 2 :(得分:0)
当你说:
extern int* PPPP;
您承诺PPPP
位于另一个翻译单元的编译器。
链接器将尝试在它给出的目标文件和库中找到PPPP
,如果不能,则会发出错误。