You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

指定DllMain为DLL入口仍报LNK2019未解析_main错误如何解决?

问题原因
  • 你的代码调用了puts()这类C标准库(CRT)函数,默认会链接静态CRT库LIBCMT.lib。该库的内置启动逻辑需要先执行CRT自身的初始化函数__tmainCRTStartup,该函数会根据程序类型查找对应的入口符号:控制台程序找main,窗口程序找WinMain,DLL程序默认找CRT封装的_DllMainCRTStartup。
  • 你手动指定了/ENTRY:DllMain,相当于跳过了CRT的初始化启动逻辑,但链接器仍然会尝试链接CRT的启动代码,因此抛出找不到main符号的错误。另外即使绕过该错误,未初始化的CRT也会导致puts()调用直接运行崩溃。
修复方案

方案1:保留CRT依赖(推荐,无需修改代码)

常规DLL开发不需要手动指定入口点,链接器会自动使用CRT提供的_DllMainCRTStartup作为入口,该函数完成CRT初始化操作后,会自动调用你编写的DllMain函数。
修改链接命令为:

link DllWithEntryPoint.obj /DLL

方案2:完全移除CRT依赖(适合极小体积DLL场景)

如果你不需要使用CRT功能,希望压缩DLL体积,可以做两处修改:

  1. 替换所有CRT函数调用为Windows原生API,比如将puts()替换为WriteConsoleA/OutputDebugStringA等Win32 API,移除stdio.h等CRT头文件引用。
  2. 链接时添加/NODEFAULTLIB参数禁止链接默认CRT库,保留自定义入口配置:
link DllWithEntryPoint.obj /DLL /ENTRY:DllMain /NODEFAULTLIB kernel32.lib

该方案下无法使用任何C标准库功能,所有逻辑都需要调用Windows系统API实现。

内容的提问来源于stack exchange,提问作者lightning

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:36:03