处理--->错误 error LNK2019: 无法解析的外部符号"~~~~" | 该符号"~~~"在函数 _main 中被引用

在使用VS开发C语言数据结构作业时遇到错误LNK2019,通过更改文件扩展名(从.h到.cpp)解决了无法解析外部符号的问题。文中详细介绍了C语言的编译过程和解决方案。

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

处理--->错误 error LNK2019: 无法解析的外部符号"~~~~"  | 该符号"~~~"在函数 _main 中被引用

--------------------------------------------------------------------------------------------------------------------------------

先吐会儿槽:妹夫的!正在学习数据结构(C语言描述),原以为可以不用那VC6++丑陋无能的IDE了,这回改用VS觉得舒服多了,不多还是遇到了不小磕磕碰碰的,有点恼人。

--------------------------------------------------------------------------------------------------------------------------------

其实C语言的运行编译机制偶不是很懂。

这两天要求写个数据结构作业,为达到接口与实现分离,要求结构如下:

LinkList.h  包含链表结构及操作方法的声明

LinkList.c  包含链表操作方法的详细

main.c       主函数文件,包含针对链表操作的方法

--------------------------------------------------------------------------------------------------------------------------------

内部代码略过不贴....

main.c 里include "LinkList.h"

LinkList.c 里因为需要引用链表,也include "LinkList.h"

--------------------------------------------------------------------------------------------------------------------------------

C语言的编译过程参考这里,http://mcuos.com/thread-3793-1-1.html

大概的编译过程就上面的四个过程:预编译、编译、汇编、链接。

所以这里的“错误 error LNK2019 ”就出在链接过程吧。

总是main函数里找到了函数声明,却没找到函数的定义。

奶奶的,这年头谷歌总是失灵,度娘果真不给力。查了大半天都没头绪。

真二,后来改文件名就OK了。

LinkList.c-->-改成"LinkList.cpp"

main.c--->改成"main.cpp"

编译通过~!

--------------------------------------------------------------------------------------------------------------------------------

参考别人的方法都不见效哦。比如这几个:

方法一 更改项目属性

右键项目“属性”--》“配置属性”--》“链接器”--》“系统”--》将“子系统”改为“Windows(/SUBSYS:WINDOWS)”

 

方法二 在头文件中加入语句#pragma   comment(   lib,   "ws2_32.lib"   )  来显式加载。

即:

#include  <winsock2.h>
#pragma comment(lib, "WS2_32")

--------------------------------------------------------------------------------------------------------------------------------

 

<think>好的,我现在遇到了一个编译错误LNK2019,提示无法解析外部符号_main。这让我有点困惑,因为我记得在C++程序中,main函数是入口点,必须存在的。但错误信息里提到了___tmainCRTStartup引用了_main,而我的项目里确实没有定义main函数。我需要仔细分析可能的原因。 首先,我应该检查项目类型。比如,如果创建的是Windows应用程序(比如Win32或MFC项目),入口点可能不是main,而是WinMain。这时候编译器会寻找WinMain,如果找不到就会报错。这时候,解决方案可能是修改项目设置,将入口点改为main,或者添加正确的WinMain函数。 其次,可能是我在代码中错误地定义了main函数的签名。比如,拼写错误,或者参数类型不正确。比如,main的正确形式应该是int main(int argc, char* argv[])或者int main()。如果写成了void main()或者其他形式,有些编译器可能会报错。 然后,检查项目设置中的子系统选项。如果项目配置为控制台应用程序,但入口点不是main,或者反之,可能引发这个错误。比如,在Visual Studio中,链接器子系统设置为控制台(/SUBSYSTEM:CONSOLE)需要main函数,而Windows应用程序(/SUBSYSTEM:WINDOWS)需要WinMain。所以需要确认子系统设置和入口函数是否匹配。 另外,可能引入的库文件或依赖项有问题。比如用户提到的引用[4],引入某些静态库可能导致链接器找不到入口点。这时候需要检查这些库是否与项目类型兼容,或者是否存在配置冲突。 还有一种情况是,如果项目是MFC应用程序,可能不需要main函数,而是由框架自动处理入口点。这时候如果错误地包含了控制台应用程序的设置,或者代码中有多余的main定义,可能导致冲突。需要检查项目属性中的MFC设置是否正确,比如是否选择了“使用MFC共享DLL”等选项。 现在,我应该综合这些可能性,给出具体的解决步骤。例如: 1. 确认项目类型是否正确,检查入口函数是否存在且签名正确。 2. 调整链接器的子系统设置,确保与控制台或Windows应用程序匹配。 3. 检查是否有第三方库冲突,必要时重新配置库的链接方式。 4. 对于MFC项目,确保项目属性中的配置正确,避免混合使用不同的运行时库。 同时,用户提供的引用[3]提到即使新建MFC程序也会出现此错误,可能是在项目创建时选择了错误的应用程序类型,或者在配置中错误地链接了运行时库。例如,如果项目使用多线程调试DLL(/MDd),但某些库可能链接了静态版本,导致冲突。需要统一运行时库的设置。 最后,可能需要重新创建项目或清理解决方案,确保中间文件不会残留错误配置。如果问题依旧,可以尝试逐步排除法,比如创建一个空项目,逐步添加代码和库,定位问题来源。</think>### 解决LNK2019: unresolved external symbol _main错误的方法 #### 错误原因分析 该错误表明链接器在编译时找不到程序入口函数`main`(或`WinMain`)。根本原因通常是**项目类型与入口函数不匹配**,或入口函数未正确定义。以下是具体场景及解决方案: --- #### 1. 确认项目类型与入口函数对应关系 - **控制台应用程序**:需定义`int main()`或`int main(int argc, char* argv[])`,且链接器子系统设置为**控制台(/SUBSYSTEM:CONSOLE)**。 - **Windows应用程序**(如Win32/MFC):需定义`int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)`,子系统设置为**Windows(/SUBSYSTEM:WINDOWS)**[^1][^3]。 **验证步骤**: 1. 在Visual Studio中右键项目 → **属性** → **链接器** → **系统** → **子系统**。 2. 根据项目类型选择正确的子系统(控制台或Windows)。 3. 检查代码中是否存在匹配的入口函数--- #### 2. 修复入口函数定义问题 - **错误示例**: ```cpp void main() { ... } // 错误!返回类型应为int ``` - **正确形式**: ```cpp int main() { // 代码 return 0; } ``` --- #### 3. MFC项目的特殊处理 MFC应用程序通常不需要手动定义`main`或`WinMain`,其入口点由框架自动生成。若出现此错误,可能是**项目配置冲突**: 1. 检查项目属性 → **常规** → **MFC的使用** → 选择**在共享DLL中使用MFC**。 2. 确保未错误引入控制台相关的库或编译选项[^3][^4]。 --- #### 4. 检查第三方库的兼容性 若项目中引用了静态库(如`libcmt.lib`、`msvcrtd.lib`),需确保**运行时库配置一致**: 1. 项目属性 → **C/C++** → **代码生成** → **运行时库**。 2. 所有依赖库与主项目需使用相同配置(如`/MDd`或`/MTd`)[^2][^4]。 --- #### 5. 重新生成解决方案 清理中间文件并重新编译: 1. 菜单栏 → **生成** → **清理解决方案**。 2. 再次点击**生成解决方案**。 --- #### 示例配置修正(MFC项目) 1. 右键项目 → **属性** → **链接器** → **系统** → **子系统** → 设为**Windows (/SUBSYSTEM:WINDOWS)**。 2. **高级** → **入口点** → 留空(由MFC自动处理)[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值