在VisualStudio中开发c程序时经常出现的链接问题是LNK2019无法分析外部符号。 此问题通常可能是因为没有将引用的代码链接到当前项目。 也有例外。 这是因为以下预声明类。
为了加快编译速度,经常选择在头文件中使用预声明的类名作为指针,并在代码定义文件中包含完整的类声明。
foo.h:
类福
{
公共:
void call ();
}
bar.h:
类福;
foo* f=0;
bar.cpp:
#include 'bar.h '
#include 'foo.h '
int main () {f-call ); 返回0; }
如果出现了与编译单元(一般指cpp文件)相关的) A用B、B用C ),则在两次引用不包含C )的声明时,“无法解析外部符号.”
例如:
foo.h:
类福
{
公共:
void call ();
}
bar.h:
类福;
voidBarcall(foo*f=0);
bar.cpp:
#include 'bar.h '
foo* store;
voidBarcall(foo*arg ) )。
{
store=arg;
}
main.cpp:
#include 'foo.h '
#include 'bar.h '
int main () )
{
Barcall(0;
返回0;
}
因为编译时main.cpp的foo类是完整声明,而bar.cpp的foo类只是空结构(预定义的),所以编译器会认为他们是不同的结构,找不到要找的符号。
在此示例中,由于bar.cpp不包含foo.h,因此foo结构只是空结构,与main.cpp中对barcall引用的foo结构不同,这会导致找不到符号的链接错误。
解决方案是在bar.cpp中包含foo.h以获得foo的完整声明。