处理vc中error LNK2001unresolved external symbol _WinMain@16的解决方法
- 格式:docx
- 大小:13.85 KB
- 文档页数:2
1.在创建windows应用程序时,出现如下错误:MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号_WinMain@16,该符号在函数___tmainCRTStartup 中被引用Debug\jk.exe : fatal error LNK1120: 1 个无法解析的外部命令error LNK2001: unresolved external symbol _WinMain@16debug/main.exe:fatal error LNK 1120:1 unresolved externals表示创建的项目不正确,该错误表明创建的是一个win32控制台应用程序,该程序的入口地址是Main。
创建windows应用程序时应该选择win32应用程序。
2.C++编译出现error C2664: 不能将参数 2 从“const char [5]”转换为“LPCTSTR”解决办法。
编译程序的时候出现这样的错误,原因是在新建MFC项目的时候,设置字符集Unicode 的属性。
解决方法一:在VC2010的解决方案管理器窗口内,右击你的项目“项目”,然后选“属性”(最后一项),再点“配置属性”,是个“+”号,把它展开,然后选“常规”选项卡,倒数第三项“字符集”,选择“使用多字节字符集”。
问题解决。
不过还是建议使用Unicode,否则你的程序将有很大的局限性;要是你的程序只在西方发布还好,但毕竟是适应中国大陆的程序吧,所以建议使用Unicode。
解决方法二:使用调用CString::AllocSysString();例如:CString str_cap("haha");(const WCHAR *)(str_cap.AllocSysString());(LPCTSTR)(str_cap.AllocSysString()); 同上面效果相同。
学习VC++时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于编程者来说,最好改的错误莫过于编译错误,而一般说来发生连接错误时,编译都已通过。
产生连接错误的原因非常多,尤其LNK2001错误,常常使人不明其所以然。
如果不深入地学习和理解VC++,要想改正连接错误LNK2001非常困难。
初学者在学习VC++的过程中,遇到的LNK2001错误的错误消息主要为:unresolved external symbol “symbol”(不确定的外部“符号”)。
如果连接程序不能在所有的库和目标文件内找到所引用的函数、变量或标签,将产生此错误消息。
一般来说,发生错误的原因有两个:一是所引用的函数、变量不存在、拼写不正确或者使用错误;其次可能使用了不同版本的连接库。
以下是可能产生LNK2001错误的原因:一.由于编码错误导致的LNK2001。
1.不相匹配的程序代码或模块定义(.DEF)文件能导致LNK2001。
例如,如果在C++源文件内声明了一变量“var1”,却试图在另一文件内以变量“VAR1”访问该变量,将发生该错误。
2.如果使用的内联函数是在.CPP文件内定义的,而不是在头文件内定义将导致LNK2001错误。
3.调用函数时如果所用的参数类型同函数声明时的类型不符将会产生LNK2001。
4.试图从基类的构造函数或析构函数中调用虚拟函数时将会导致LNK2001。
5.要注意函数和变量的可公用性,只有全局变量、函数是可公用的。
静态函数和静态变量具有相同的使用范围限制。
当试图从文件外部访问任何没有在该文件内声明的静态变量时将导致编译错误或LNK2001。
函数内声明的变量(局部变量)只能在该函数的范围内使用。
C++的全局常量只有静态连接性能。
这不同于C,如果试图在C++的多个文件内使用全局变量也会产生LNK2001错误。
一种解决的方法是需要时在头文件中加入该常量的初始化代码,并在.CPP文件中包含该头文件;另一种方法是使用时给该变量赋以常数。
VC6.0 error LNK2001: unresolved external symbol _main解决办法学习VC++时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于编程者来说,最好改的错误莫过于编译错误,而一般说来发生连接错误时,编译都已通过。
产生连接错误的原因非常多,尤其LNK2001错误,常常使人不明其所以然。
如果不深入地学习和理解VC++,要想改正连接错误LNK2001非常困难。
初学者在学习VC++的过程中,遇到的LNK2001错误的错误消息主要为:unresolved external symbol “symbol”(不确定的外部“符号”)。
如果连接程序不能在所有的库和目标文件内找到所引用的函数、变量或标签,将产生此错误消息。
一般来说,发生错误的原因有两个:一是所引用的函数、变量不存在、拼写不正确或者使用错误;其次可能使用了不同版本的连接库。
以下是可能产生LNK2001错误的原因:一.由于编码错误导致的LNK20011.不相匹配的程序代码或模块定义(.DEF)文件能导致LNK2001。
例如, 如果在C++源文件内声明了一变量“var1”,却试图在另一文件内以变量“VAR1”访问该变量,将发生该错误。
2.如果使用的内联函数是在.CPP文件内定义的,而不是在头文件内定义将导致LNK2001错误。
3.调用函数时如果所用的参数类型同函数声明时的类型不符将会产生LNK2001。
4.试图从基类的构造函数或析构函数中调用虚拟函数时将会导致LNK2001。
5.要注意函数和变量的可公用性,只有全局变量、函数是可公用的。
静态函数和静态变量具有相同的使用范围限制。
当试图从文件外部访问任何没有在该文件内声明的静态变量时将导致编译错误或LNK2001。
函数内声明的变量(局部变量) 只能在该函数的范围内使用。
C++ 的全局常量只有静态连接性能。
这不同于C,如果试图在C++的多个文件内使用全局变量也会产生LNK2001错误。
解决链接错误:error LNK2001: 无法解析的外部符号__iob2008-09-05 16:28该错误主要是由于静态库在VC6编译而主程序在VC2005编译,大家用的CRT不同。
解决办法,代码中增加#ifdef __cplusplusextern "C"#endifFILE _iob[3] = {__iob_func()[0], __iob_func()[1], __iob_func()[2]};此错误的产生根源:在VC6的stdio.h之中有如下定义_CRTIMP extern FILE _iob[];#define stdin (&_iob[0])#define stdout (&_iob[1])#define stderr (&_iob[2])stdin、stdout、stderr是通过查_iob数组得到的。
所以,VC6编译的程序、静态库只要用到了printf、scanf之类的都要链接_iob数组。
而在vc2005中,stdio.h中变成了_CRTIMP FILE * __cdecl __iob_func(void);#define stdin (&__iob_func()[0])#define stdout (&__iob_func()[1])#define stderr (&__iob_func()[2])_iob数组不再是显式的暴露出来了,需要调用__iob_func()函数获得。
所以vc6的静态库链接VC2005的C运行库不到_iob数组.通过重新定义FILE _iob[3] = {__iob_func()[0], __iob_func()[1], __iob_func()[2]};就把vc6需要用到的_iob数组搞出来了。
C++⼯程编译之“errorLNK2001:⽆法解析的外部符号” 今天⼀整天都在折腾“error LNK2001: ⽆法解析的外部符号”,就在头疼不已的时候,总算是找到问题原因了:各个动态链接库的编译⽅式必须统⼀才⾏,要不然很容易对库函数的引⽤产⽣冲突。
简单来说就是,如果使⽤的第三⽅函数库编译⽅式采⽤/MD,那么主⼯程也应该使⽤/MD。
我使⽤了libevent,⽽主⼯程默认采⽤/MT,所以需要忽略⼀⼤堆的函数库,我还纳闷呢,怎么会这么奇怪!!今天总算是解决了长久以来的困惑了。
下⾯引⽤⼀篇⽂章的描述: 再参考⼀篇:BackgroundMSDN中对于在不同的配置下Link的LIB作了说明:C Runtime Library:开关对应的库版本/MD MSVCRT.LIB多线程DLL的Release版本/MDd MSVCRTD.LIB多线程DLL的Debug版本/MT LIBCMT.LIB多线程静态链接的Release版本/MTd LIBCMTD.LIB多线程静态链接的Debug版本/clr MSVCMRT.LIB托管代码和⾮托管代码混合/clr:pure MSVCURT.LIB纯托管代码C++ Standard Library:开关对应的库版本/MD MSVCPRT.LIB多线程DLL的Release版本/MDd MSVCPRTD.LIB多线程DLL的Debug版本/MT LIBCPMT.LIB多线程静态链接的Release版本/MTd LIBCPMTD.LIB多线程静态链接的Debug版本 编译器会⾃动根据编译选项,选择对应的LIB⽂件。
⼀般情况下这不会出现问题。
然⽽,在部分情况下,⼀旦你的程序的各个部分(LIB, OBJ…)并⾮由相同的编译选项编译出,⽽Link在⼀起的话,会出现各种各样的看似很难解决的问题,这类问题主要以重复定义的错误形式存在,通常的解决⽅法也很简单,就是选择同样的编译选项进⾏编译之后再Link。
在VC++6.0中编译出错时解决方法汇总在VC++6.0中编译出错时解决方法汇总【1】missing function header (old-style formal list?)#SinaEditor_T emp_FontName 解决方法该函数的函数头后边加了分号去掉即可例如:void fun();{}就会出现那种情况【2】在编译VC++6.0是,出现fatal error C1010: unexpected end of file while looking for precompiled header directive 的错误.解决方法:1、如果发生错误的文件是由其他的C代码文件添加进入当前工程而引起的,则Alt+F7进入当前工程的Settings,选择C/C++选项卡,从Category组合框中选中Precompiled Headers,选择Not Using Precompiled headers。
确定。
2、在文件开头添加:#include "stdafx.h"对预编译头文件说明如下:所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC 标准头文件(如Windows.H、Afxwin.H)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果。
这样可以加快编译速度,节省时间。
预编译头文件通过编译stdafx.cpp生成,以工程名命名,由于预编译的头文件的后缀是“pch”,所以编译结果文件是projectname.pch。
编译器通过一个头文件stdafx.h来使用预编译头文件。
stdafx.h 这个头文件名是可以在project的编译设置里指定的。
编译器认为,所有在指令#include "stdafx.h"前的代码都是预编译的,它跳过#include "stdafx. h"指令,使用projectname.pch编译这条指令之后的所有代码。
vc中error LNK2001:unresolved external symbol _WinMain@16的解决方法
[ 2006-8-15 12:14:00 | By: Robert.Long ]
23
推荐一,问题描述
error LNK2001: unresolved external symbol _WinMain@16
debug/main.exe:fatal error LNK 1120:1 unresolved externals
error executing link.exe;
二,产生这个问题可能的原因
1,你用vc建了一个控制台程序,它的入口函数应该是main, 而你使用了WinMain.
2. 你用vc打开了一个.c/.cpp 文件,然后直接编译这个文件,这个文件中使用了WinMian 而不是main作为入口函数。
vc这时的默认设置是针对控制台程序的。
三,解决方法
1.进入project->setting->c/c++, 在category中选择preprocessor,在processor definitions中删除_CONSOLE, 添加_WINDOWS
2.进入project->setting->Link, 在Project options中将/subsystem:console改为/subsystem:windows.
3.保存设置,Rebuild All.
VS2005中的设置请参考对应项进行设置
四,VS2005中的设置
1.菜单中选择Project->Properties, 弹出Property Pages窗口
2.在左边栏中依次选择:Configuration Properties->C/C++->Preprocessor,然后在右边栏的Preprocessor Definitions对应的项中删除_CONSOLE, 添加_WINDOWS.
3.在左边栏中依次选择:Configuration Properties->Linker->System,然后在右边栏的SubSystem 对应的项改为Windows(/SUBSYSTEM:WINDOWS)
4.Rebuild All. Ok ?
测试:(环境:vs2005,编程语言vc)
1.用文本编辑器编写如下代码:
// test.c
#i nclude <windows.h>
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MessageBox(NULL, "Hello!", "title", MB_OK);
}
假设把文件包存为test.c.
2.用vs2005建一个Win32 Console Application, 注意在Application Settings设置为Empty project. 然后把test.c添加到工程中去。
3.vs2005建立的工程默认是支持UNICODE的,我不用这个,所以在菜单中选择Project->Properties, 弹出Property Pages窗口。
在左边栏中依次选择:Configuration Properties->General,然后把右边栏的Character Set 改为Use Multi-Byte Character Set.
4.编译,出现如下错误:
MSVCRTD.lib(crtexe.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
C:\test\Debug\test.exe : fatal error LNK1120: 1 unresolved externals
5.按照上述VS2005中的设置方法进行设置,然后再编译,错误消失了吧!。