引起
LNK2001
的常见错误都有哪些
遇到的
LNK2001
错 误主要为:
unresolved external symbol “symbol”
如果链接程序不能在 所有的库和目标文件内找到所引用的函数、变量或标签,将产生此错误信息。
一般来说,发生错误 的原因有两个:一是所引用的函数、变量不存在,拼写不正确或者使用错误;其次可能使用了不同版本的链接库。以下是可能产生
LNK2001
错误 的原因:
<1>
由于编码错误导致的
LNK2001
错误
(1)
不相匹配的程序代码或模块定义
(.DEF)
文件导致
LNK2001
。例 如,如果在
C++
源文件了内声明了一变量
“var1”
,却试图在另一个文件内以变量
“var1”
访问 改变量。
(2)
如果使用的内联函数是在
.cpp
文件内定义的,而不是在头文件内定义将导致
LNK2001
错 误。
(3)
调用函数时如果所用的参数类型和头函数声明时的类型不符将会产生
LNK2001
错 误。
(4)
试图从基类的构造函数或析构函数中调用虚拟函数时将会导致
LNK2001
错 误。
(5)
要注意函数和变量的可公用性,只有全局变量、函数是可公用的。静态函数和静态变量具有相同的使用范 围限制。当试图从文件外部方位任何没有在该文件内声明的静态变量时将导致编译错误或
LNK2001
错误。
<2>
由于编译和联机的设置而造成的
LNK2001
错误
(1)
如果编译时使用的是
/NOD(/NODERAULTLIB)
选项,程序所需要的运行库和
MFC
时将得到又编译器写入目标文件模块,但除非在文件中 明确包含这些库名,否则这些库不会被链接进工程文件。这种情况下使用
/NOD
将导致
LNK2001
错误
(2)
如果没有为
wWinMainCRTStartup
设定程序入口,在使用
Unicode
和
MFC
时将出现
“unresolved external on _WinMain@16”
的
LNK2001
错误信息。
(3)
使用
/MD
选项编译时,既然所有的运行库都被保留在动态链接库之内,源文件中对
“func”
的引 用,在目标文件里即对
“__imp__func”
的引用。如果试图使用静态库
LIBC.LIB
或
LIBCMT.LIB
进 行链接,将在
__imp__func
上发生
LNK2001
错误。如果不使用
/MD
选项编译,在使用
MSVCxx.LIB
链接时也会发生
LNK2001
错误。
(4)
使用
/ML
选项编译时,如用
LIBCMT.LIB
链接会在
_errno
上发生
LNK2001
错误。
(5)
当编译调试版的应用程序时,如果采用发行版模态库进行链接也会产生
LNK2001
错 误;同样,使用调试版模态库链接发行版应用程序时也会产生相同的错误。
(6)
不同版本的库和编译器的混合使用也能产生问题,因为新版的库里可能包含早先的版本没有的符号和说 明。
(7)
在不同的模块中使用内联和非内联的编译选项能够导致
LNK2001
错 误。如果创建
C++
库时打开了函数内联
(/Ob1
或
/Ob2)
,但是在描述该函数的相应头文件里却关闭了函数内联
(
没有
inline
关键 字
)
,只是将得到错误信息。为避免该问题的发生,应该在相应的头文件中用
inline
关键字标志为内联函数。
(8)
不正确的
/SUBSYSTEM
或
ENTRY
设置也能导致
LNK2001
错误。
Visual C++ 6.0 工程中的项目文件都表示什么
.opt
:工程关于开发环境的参数文件。如工具条位置等信息。
.aps(AppStudio File)
资源辅助文件,二进制格式,一般不用去管它。
.clw
:
ClassWizard
信息文件,实际上是
INI
文件格式,有兴趣可以研究一下。有时候
ClassWizard
出了问题,手工修改
CLW
文件可以解决。如果此文件不存在的话,每次用
ClassWizard
的时候回提示是否重建。
.dsp(DevelopStudio Project)
:项目文件,文本格式,不过不熟悉的不要手工修改。
.dsw(DevelopStudio Workspace)
:是工作区文件,其他特点和
.dsp
差不多。
.plg
:是编译信息文件,编译时的
error
和
warning
信息 文件
(
实际上是一个
html
文件
)
,一般用处不大。在单击菜单【
Tool
】-
>
【
Option
】弹 出的对话框里面有个选项可以控制这个文件的生成。
.hpj(Help Project)
:是生成帮助文件的工程,用
microsoft Help Compiler
可以处理。
.mdp(Microsoft DevStudio Project)
:是旧版本的项目文件,如果要打 开此文件的话,会提示你是否转换成新的
.dsp
格式。
.bsc
:是用于浏览项目信息的,如果用
Source Brower
的话就必须有这个文件。如果不 用这个功能的话,可以在
Project Options
里面去掉
Generate Browse Info File
,这样可以加快编译速度。
.map
是执行文件的映象信息记录文件,除非对系统底层,这个文件一般用不着。
.pch(Pre-Compiled File)
:是与编译文件,可以加快编译速度,但是文件非常大。
.pdb(Program Database)
:记录了程序有关的一些数据和调试信息,在调试的时 候可能有用。
.exp
:只有在编译
DLL
的时候才会生成,记录了
DLL
文件的一些信息,一般也没有用。
.ncb :无编译浏览文件 (no compile browser) 。当自动完成功能出问题时可以删除此 文件。编译工程后会自动生成。
工作中每当vc6.0假死的时候,我都会del *.ncb, *.opt, *.pch, 然后重新打开工程文件。原因是项目太大了,导致VC6.0经常假死,没反应。