编译问题汇总---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



### 解决方案 #### 1. **检查硬件连接** 确保开发板处于正常供电状态,并确认S-TLINK与开发板之间的接线无误且接触良好。如果存在接触不良的情况,可能会导致“No target connected”的错误提示[^1]。 #### 2. **验证软件配置** 进入Keil或其他IDE中的调试设置界面: - 点击工具栏中的魔术棒图标。 - 进入“Debug”选项卡。 - 确认选择了正确的烧录器类型(如ST-Link),并点击右侧的“Settings”按钮进一步调整参数。 - 检查相关配置项是否正确勾选,尤其是涉及SWD模式的部分。 #### 3. **处理SWD引脚冲突** 如果上述操作仍无法解决问题,则需考虑是否存在SWD引脚被占用或禁用的可能性。以下是两种常见的解决方案: - 方法一:按住Reset按键的同时启动下载过程,待程序成功写入后再释放Reset键。此方式利用时间差绕过了可能导致干扰的操作阶段。 - 方法二:将Boot0引脚拉至高电平完成固件刷新后恢复原状继续后续流程[^1]。 #### 4. **更新ST-Link驱动/工具版本** 当遇到“Flash Download failed - Target DLL has been cancelled”这类特定错误时,应排查是否有因不同组件间版本差异引发兼容性障碍的因素存在。例如最近更换了新的ST-link设备或是升级了KEIL环境却未同步跟进相应支持包安装的话就容易发生此类状况。此时建议前往官方站点获取最新版ST-Link Utility应用程序及其配套资源进行全局替换以实现最佳适配效果[^3]。 #### 5. **重新编译项目源码** 最后还需注意一点就是务必保证每次尝试上传前都已经完成了整个项目的完全构建动作而非仅仅针对单个文件做局部修正而已;否则即便其他条件均满足也可能由于残留旧数据等原因最终还是得不到预期成果——记住那个拥有双箭头图标的才是代表整体汇总之义的关键命令哦! ```python # 示例伪代码展示如何通过Python模拟简单的重试机制用于自动化测试场景下反复执行直到成功为止的功能逻辑结构示意: def retry_flash_programming(attempts=3): attempt_count = 0 while attempt_count < attempts: try: # 假设此处调用了某个函数负责实际完成flash编程工作... flash_result = perform_flash_operation() if flash_result == 'Success': print("Programming succeeded.") break elif flash_result == 'Failure-DLLCancelled': raise Exception('Target DLL was cancelled.') except Exception as e: attempt_count += 1 print(f"Attempt {attempt_count} failed with reason: {str(e)}. Retrying...") else: print("All attempts exhausted without success.") retry_flash_programming(5) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值