LNK2019:未解析的外部符号 _main 在函数 ___tmainCRTStartup 中引用
Posted
技术标签:
【中文标题】LNK2019:未解析的外部符号 _main 在函数 ___tmainCRTStartup 中引用【英文标题】:LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup 【发布时间】:2012-06-30 03:41:13 【问题描述】:我有以下错误:
LNK2019:函数 ___tmainCRTStartup 中引用的未解析外部符号 _main
有很多与此错误相关的线程,但这些解决方案都不适用于我。而且,没有人解释为什么会出现这个错误。
我试过了:
wWinMainCRTStartup
作为链接器属性中的入口点 (thread)
将链接器设置为“Windows”(与上述相同的线程)
右键单击解决方案名称->添加->现有项目->带有主文件的文件(与上述相同的线程)
#include <tchar.h>
(error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup)
尝试项目 + 属性、C/C++、代码生成、缓冲区安全检查 = 否 (thread)
选项:C/C++、代码生成、运行时库=/MTd; C/C++,代码生成,基本运行时检查=默认; C/C++,代码生成,缓冲区安全检查=否;链接器,高级,入口点=main (thread)
注释掉 main.cpp
中的标头,using namespace std
和 #include <iostream>
除外 - 导致引用这些标头的函数出现级联和滚雪球错误
我删除了main.cpp
中除测试代码外的所有内容,并排除了除main.cpp
之外的所有源文件;正如预期的那样,它是朝着正确方向迈出的一小步。问题一定出在其中一个头文件上。
使用 Win32 Windows 应用程序模板创建新项目(thread 和 thread)
没有尝试过,怀疑这些也行不通:
使用int main()
(不确定它们的意思,文件名或主函数名)(thread)
使用cmake
在 Windows 7 x64 上构建 (thread)
为什么会出现这个错误,解决方法是什么?
【问题讨论】:
你有int main(char** argv, int argc)
函数吗?
@Linuxios,它是“int main(int argc, char** argv)”(您的原型中的顺序错误)
@BlakBat:谢谢。对不起。无论如何,我什至不在 Windows 上工作,但这是无处不在的签名。呵呵。
【参考方案1】:
按照前面的建议将系统设置为控制台。只是,还得把字符集改成 Unicode,见上面 Visual Studio 2015 的截图。
【讨论】:
【参考方案2】:我之前遇到过这个问题,但是已经解决了。主要问题是我错误地拼写了 int main() 函数。而不是写 int main() 我写了 int mian()....干杯!
【讨论】:
这个答案对你自己来说太具体了。由于main
在 OP 的问题中的任何地方都没有拼写错误,因此没有理由认为这是问题所在。
OP 没有显示任何源代码,他只是说明了错误。我今天也遇到了同样的错误,但后来意识到我拼错了main这个词,所以在更正之后错误消失了..【参考方案3】:
出于一个有趣的原因,我在 Visual Studio 2015 中也发生了这种情况。只需将其添加到此处,以防万一发生在其他人身上。
我已经在项目中有很多文件,并且我正在添加另一个具有主要功能的文件,但是当我最初添加文件时,我在扩展名中输入了一个错字(.coo 而不是 .cpp)。我纠正了这一点,但是当我完成时,我得到了这个错误。事实证明,Visual Studio 很聪明,当添加文件时,由于初始扩展名,它决定它不是源文件。
在解决方案资源管理器中右键单击文件并选择属性 -> 常规 -> 项目类型并将其设置为“C/C++ 编译器”修复了该问题。
【讨论】:
【参考方案4】:您的项目类型是什么?如果是“Win32 项目”,您的入口点应该是(w)WinMain
。如果它是“Win32 控制台项目”,那么它应该是(w)main
。名称_tmain
被#defined 为main
或wmain
,具体取决于是否定义了UNICODE。
如果是 DLL,则为DllMain
。
项目类型可以在项目属性、链接器、系统、子系统下看到。它会说“控制台”或“Windows”。
请注意,入口点名称取决于是否定义了 UNICODE。在VS2008中是默认定义的。
main 的正确原型是
int _tmain(int argc, _TCHAR* argv[])
或
int _tmain()
确保它是其中之一。
编辑:
如果您在 _TCHAR 上遇到错误,请放置一个
#include <tchar.h>
如果您认为问题出在某个标题上,请使用 main() 转到文件的属性,然后在 Preprocessor 下启用预处理文件的生成。然后编译。您将获得一个具有相同名称且扩展名为 .i 的文件。打开它,看看 main() 函数是否发生了任何不愉快的事情。理论上可以有流氓#defines...
EDIT2:
定义 UNICODE(这是默认值)后,链接器期望入口点是 wmain(),而不是 main()。 _tmain 具有与 UNICODE 无关的优势 - 它可以转换为 main 或 wmain。
前段时间,有理由同时维护 ANSI 构建和 Unicode 构建。在 Windows 95/98/Me 中,Unicode 支持非常不完整。主要的 API 是 ANSI,Unicode 版本随处可见,但并不普遍。此外,VS 调试器无法显示 Unicode 字符串。在 NT 内核操作系统(即 Windows 2000/XP/Vista/7/8/10)中,Unicode 支持是主要的,并且在顶部添加了 ANSI 函数。所以从 VS2005 开始,项目创建时的默认设置是 Unicode。这意味着 - wmain。由于参数类型不同,它们无法保持相同的入口点名称。 _TCHAR #定义为 char 或 wchar_t。所以 _tmain 要么是 main(int argc, char **argv) 要么是 wmain(int argc, wchar_t **argv)。
您在某个时候在_tmain
收到错误的原因可能是因为您没有将argv
的类型更改为_TCHAR**
。
如果您不打算支持 ANSI(可能不支持),您可以将入口点重新定义为
int wmain(int argc, wchar_t *argv[])
并删除 tchar.h
包含行。
【讨论】:
我尝试将 int main() 更改为 int _tmain() 仍然出现 lnk2019 错误 int _tmain(int argc, _TCHAR* argv[]) 导致错误 C2061:语法错误:标识符 '_TCHAR';我尝试了 int main(int argc, char** argv) 的变体,它返回了初始 lnk2019 错误 如果我删除除#include就我而言,这是因为我不小心删除了(未删除)Header Files 部分中的stdafx.h
和targetver.h
文件。
将这些文件添加回Header Files,问题就解决了。
我有这些:
#pragma comment( linker, "/entry:\"mainCRTStartup\"" ) // set the entry point to be main()
我只需要评论一下(通过添加//
)就可以了。
【讨论】:
【参考方案6】:如果您有一个“Win32 项目”+ 定义了一个 WinMain 并且您的子系统链接器设置设置为 WINDOWS,如果有人将链接器设置中的“附加选项”设置为“/SUBSYSTEM:CONSOLE”,您仍然会收到此链接器错误"(看起来这个附加设置优于实际的子系统设置。
【讨论】:
【参考方案7】:几分钟前我遇到了这个问题。当我在 main() 定义中添加 'extern "C"' 时,它就消失了。
奇怪的是,我昨天写的另一个简单程序几乎相同,没有外部“C”,但编译时没有这个链接器错误。
这让我觉得问题出在某些配置对话框深处的一些微妙设置,而“extern "C"”并没有真正解决根本问题,但表面上使事情正常进行。
【讨论】:
【参考方案8】:当我不小心将 wmain 放入命名空间时,我遇到了这个错误。 wmain 不应位于任何命名空间中。此外,我正在使用的一个库中有一个 main 函数,而 VS 从那里获取了 main 函数,这让它变得更加陌生。
【讨论】:
我敢打赌这是很多情况下的问题。【参考方案9】:因为它还没有被提及,所以这是我的解决方案:
在为我的项目创建新配置后,我的 DLL 出现此错误。我必须去Project Properties -> Configuration Properties -> General
并将Configuration Type
更改为Dynamic Library (.dll)
。
因此,如果您在尝试了所有其他方法后仍然遇到问题,则值得检查一下配置类型是否符合您对项目的期望。如果设置不正确,编译器将寻找错误的主符号。就我而言,它正在寻找WinMain
而不是DllMain
。
【讨论】:
【参考方案10】:我发现当我选择 项目->属性->链接器->系统->子系统->控制台(/subsystem:console), 然后确保包括 功能 : int _tmain(int argc,_TCHAR* argv[])return 0 所有的编译,链接和运行都可以;
【讨论】:
确保包含 tchar.h 这对我也有用。事实上,当子系统“未设置”时它也可以工作。【参考方案11】:我在尝试关闭控制台应用程序项目中的预编译头文件并删除头文件 stdafx.h 时遇到此错误
要解决此问题,请转到您的项目属性 -> 链接器 -> 子系统 并将值更改为 Not Set
在您的主类中,使用其他人已经提到的标准 C++ 主函数原型:
int main(int argc, char** argv)
【讨论】:
【参考方案12】:这个 main
在 linux 和 windows 中都可以工作 - 通过反复试验和其他人的帮助找到它,所以无法解释它为什么工作,它只是 int main(int argc, char** argv)
不需要tchar.h
这是***中相同的答案Main function
【讨论】:
以上是关于LNK2019:未解析的外部符号 _main 在函数 ___tmainCRTStartup 中引用的主要内容,如果未能解决你的问题,请参考以下文章
glCubicRayCast.obj : error LNK2019: 无法解析的外部符号 __imp__glewInit,该符号在函数 _main中被引用