编译问题汇总---Link Error

本文汇总了编译过程中遇到的各种错误及解决方案,包括ULONG_PTR的定义、未声明标识符错误、外部符号错误、Windows子系统设置错误、程序入口设置错误、线程运行时库设置错误等,并提供了详细的错误修复步骤和相关链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

慢慢更新~

1、ULONG_PTR到底是什么?

#if defined(_WIN64)
  typedef __int64 INT_PTR, *PINT_PTR;
  typedef unsigned __int64 UINT_PTR, *PUINT_PTR;

  typedef __int64 LONG_PTR, *PLONG_PTR;
  typedef unsigned __int64 ULONG_PTR, *PULONG_PTR;

  #define __int3264 __int64

#else
  typedef _W64 int INT_PTR, *PINT_PTR;
  typedef _W64 unsigned int UINT_PTR, *PUINT_PTR;

  typedef _W64 long LONG_PTR, *PLONG_PTR;
  typedef _W64 unsigned long ULONG_PTR, *PULONG_PTR;

  #define __int3264 __int32

#endif
#endif


参考:http://topic.youkuaiyun.com/u/20110325/11/46f477d8-1a97-450a-b965-8d3858e4a83b.html

 

2、'KBDLLHOOKSTRUCT' : undeclared identifier

#ifndef WINVER
#define WINVER 0x0400
#endif

#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0400
#endif


参考:http://topic.youkuaiyun.com/u/20091204/12/9db1871b-5e45-4917-8db6-4a7ec5f9ebb5.html


3、error LNK2001: unresolved external symbol _main解决办法

解决外部符号错误:_main,_WinMain@16,__beginthreadex -!t'my`yK  
在创建MFC项目时, 不使用MFC AppWizard向导, 会在编译时产生很多连接错误, 如error LNK2001错误, 典型的错误提示有: m1+4#'  
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main (gd){j  
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 OuR5T>>  
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16 *_g+&Us1  
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex }t,6 oT  
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex <u%N(=9  
]wpN"w"  
4、 Windows子系统设置错误, 提示: )WA5FzPLw  
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main *+oJ(e  
4f{'{1]/ 
 
Windows项目要使用Windows子系统, 而不是Console, 可以这样设置: *^'y#/Dg  
z !DF-%3|  
[Project] --> [Settings] --> 选择"Link"属性页,  Qo!  
在Project Options中将/subsystem:console改成/subsystem:windows   T`H.k"Y{  
Xn?{t*{  
5、 Console子系统设置错误, 提示: vwK 7b0M  
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 4Y~E`L0,  
8%P ><" 
 
控制台项目要使用Console子系统, 而不是Windows, 设置: *Cl5Y':|h  
sipSn4_  
[Project] --> [Settings] --> 选择"Link"属性页, WveN']q/  
在Project Options中将/subsystem:windows改成/subsystem:console BR4C@Z  
1 vBkC&  
6、程序入口设置错误, 提示: dy2$&$=  
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16 sP.>uExt  
G- (k~1q 
 
通常, MFC项目的程序入口函数是WinMain, 如果编译项目的Unicode版本, 程序入口必须改为wWinMainCRTStartup, 所以需要重新设置程序入口: r#~P5[aV  
Os hl6 i  
[Project] --> [Settings] --> 选择"Link"属性页, "1zk_#B*  
在Category中选择Output, p HGRL  
再在Entry-point symbol中填入wWinMainCRTStartup, 即可 >IC}SZ  
F)c[@/.dm  
7. 线程运行时库设置错误, 提示: X;t_- f  
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex AmiBqZTp  
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex sz 23_{c?  
oz! {Fd- 
 
这是因为MFC要使用多线程时库, 需要更改设置: L a-Y,1x](  
uAk>h^pbM  
[Project] --> [Settings] --> 选择"C/C++"属性页, '%ET|1#SO  
在Category中选择Code Generation, ;Y-M)k(  
再在Use run-time library中选择Debug Multithreaded或者multithreaded 0v~5<Y'Z  
咸鱼游侠(75374355) 12:11:11 <mW.@e5_  
其中, W_qa?Jv  
Single-Threaded                单线程静态链接库(release版本) Kh4w Q   
Multithreaded                  多线程静态链接库(release版本) |F]g[En 4  
multithreaded DLL              多线程动态链接库(release版本) s-'qYgA6p  
Debug Single-Threaded          单线程静态链接库(debug版本) _ 7w_./y  
Debug Multithreaded            多线程静态链接库(debug版本) <[ ePw  
Debug Multithreaded DLL        多线程动态链接库(debug版本) H8V/O9|(  
9^x@/  
单线程: 不需要多线程调用时, 多用在DOS环境下 /PJ|d5  
多线程: 可以并发运行 clUdag,C  
静态库: 直接将库与程序Link, 可以脱离MFC库运行 X]pEmHl  
动态库: 需要相应的DLL动态库, 程序才能运行 /n{&_:b+q  
release版本: 正式发布时使用 9J;ZZ/3  
debug版本: 调试阶段使用   k9PoFC#k  


参考:

http://www.cnitblog.com/ictfly/archive/2009/06/03/21976.html


8、'_beginthreadex' : undeclared identifier

有可能的原因:

1.没有包含头文件 process.h

2.没有包含库文件 LIBCMT.LIB或者MSVCRT.LIB

如果仍然有这个错误

原因就是在工程->设置->C/C++->Code Generation->Use run-time libray->选 Debug Multithread(多线程),或 Multithread!运行库必须用多线程的!

并且,在dll中间没有这个问题,只有在exe中间才有这个bug,因为dll默认的是Debug Multithread,而exe默认的是single

PS:2010.4.13

过了这么长时间又碰到了这个问题

打开process.h发现_beginthreadex' 定义的前面有一个宏判断

#ifdef  _MT
_CRTIMP unsigned long  __cdecl _beginthread (void (__cdecl *) (void *),
        unsigned, void *);
_CRTIMP void __cdecl _endthread(void);
_CRTIMP unsigned long __cdecl _beginthreadex(void *, unsigned,
        unsigned (__stdcall *) (void *), void *, unsigned, unsigned *);
_CRTIMP void __cdecl _endthreadex(unsigned);
#endif
如果在程序前面#define _MT,则不存在这个问题

而这个如果在工程的设置中间改为Debug Multithread 则也可以消除这个问题

参考: http://lili-lele.blog.sohu.com/137271825.html



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值