1 LNK2001错误
参考Linker Tools Error LNK2001 | Microsoft Docs
无法解析的外部符号"符号"。说明程序中用到的某个符号,链接器无法在任何库或者obj对象文件中找到。
原因:
1)编码方面的原因
a) 变量名称不一致,比如一个文件里定义了var1,在另一个文件里却使用VAR1。
b) 在源代码中使用内联函数,此时该函数从文件外部无法访问。应该在头文件中定义内联函数。
c) 从c++程序中调用c函数,由于编译器对c/c++函数命名不同,所以出现错误。需要在c函数前加上exern "C"。
d) 类的静态成员未初始化。
2) 编译链接方面的原因
a) 未添加相应的lib文件;
b) release和debug模式不匹配。比如,在release模式下调用debug模式编译的库。
变量和函数需要定义(defined),即需要被分配了相应的存储空间或者有函数实现的代码段。此外,c++链接器在命名中会在变量或函数名上加上类型信息等,因此如果声明和定义的类型信息不匹配,会出现错误。
比如,项目中文件有c,c++,会出现Lnk2001错误。或者把c改名cpp.
c) include一个头文件,但没有添加相应的cpp文件。
d) 调用的函数名与定义函数名称不一致。比如main中用a(),但函数定义为A()。
2 error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "StdAfx.h"”?
依次展开:配置属性》C/C++》预编译头,在右侧选择不使用预编译头
3 C3861 找不到标识符
1)没有包含命名空间
2)没有加类限定符
// C3861_a1.cpp
// Compile with: cl /EHsc /W4 C3861_a1.cpp C3861_a2.cpp
#include <iostream>
// Uncomment the following line to fix:
// int f(); // declaration makes external function visible
int main() {
std::cout << f() << std::endl; // C3861
}
// C3861_a2.cpp
int f() { // declared and defined here
return 42;
}
如上两个文件。如果a1.cpp中没有int f()这一行,出现c3861错误。补充该声明,编译器自动将对应函数链接?
lnk2019,明明有这个函数的定义,却说找不到符号。有可能是inline函数位置不对,应该放在头文件中。
c++和fortran交叉编译外部符号无法解析:pow2o3,需要添加libmmd.lib,for_stop_core_quiet,需要添加libifcore。intel_sse2_strrchr,需要添加libirc。