读书人

error LNK2001 异常

发布时间: 2012-02-09 18:22:27 作者: rapoo

error LNK2001 错误
已经被搞的头大了~~~~
先负上代码~~~

#include <iostream>
#include <string>
#include <list>
using namespace std;

list <int> getIntTagContents (string src, string startTag, string endTag)
{
list <int> contentList;
string::size_type posStartTag, posEndTag;
string::size_type posCurrent = 0;

for(;;)
{
posStartTag = src.find(startTag, posCurrent);
posEndTag = src.find(endTag, posCurrent);

if( posStartTag == string::npos || posEndTag == string::npos )
{
break;
}
else
{
int content = atoi(src.substr(posStartTag+startTag.length(), posEndTag-posStartTag-startTag.length()).c_str());
contentList.push_back(content);
posCurrent = posEndTag + endTag.length();
}
}
return contentList;
}

bool IsForbidChannel(int nChannel)
{
list <int> ::iterator itrList;


itrList = find (m_ForbidChannelList.begin(), m_ForbidChannelList.end(), nChannel);

if (itrList == m_ForbidChannelList.end())
{
return false;
}
else
{
return true;
}
}

void main()
{
static list <int> m_ForbidChannelList;
string sForbidChannel = " <ForbidChannel> 109 </ForbidChannel> <ForbidChannel> 111 </ForbidChannel> ";
cout < < "Get forbid channel " < <sForbidChannel < <endl;
m_ForbidChannelList = getIntTagContents(sForbidChannel, " <ForbidChannel> ", " </ForbidChannel> ");
for(i=0;i <=100;i++)
{
if (IsForbidChannel (i))
{
cout < < "Skip forbid channel " < <i < <endl;
continue;


}
}

}


错误提示

Compiling...
stl.cpp
Linking...
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/stl.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

stl.exe - 2 error(s), 0 warning(s)


哎~~郁闷。。
不知道怎么搞了。。

望高人指点下~~

[解决办法]
void main()
改为
main()
[解决办法]
还有其他问题,估计是代码不全。
m_ForbidChannelList什么东东?
main函数里面的i没有定义
[解决办法]
呵呵,偶是linux下编译的。估计VC就不会这样报错了。改完后:

#include <iostream>
#include <string>
#include <list>
using namespace std;
static list <int> m_ForbidChannelList;
list <int> getIntTagContents (string src, string startTag, string endTag)
{
list <int> contentList;
string::size_type posStartTag, posEndTag;
string::size_type posCurrent = 0;

for(;;)
{
posStartTag = src.find(startTag, posCurrent);
posEndTag = src.find(endTag, posCurrent);

if( posStartTag == string::npos || posEndTag == string::npos )
{
break;
}
else
{
int content = atoi(src.substr(posStartTag+startTag.length(), posEndT
ag-posStartTag-startTag.length()).c_str());
contentList.push_back(content);
posCurrent = posEndTag + endTag.length();
}
}
return contentList;
}

bool IsForbidChannel(int nChannel)
{
list <int> ::iterator itrList;


itrList = find (m_ForbidChannelList.begin(), m_ForbidChannelList.end(), nCha
nnel);
if (itrList == m_ForbidChannelList.end())
{
return false;
}
else
{
return true;
}
}

main()
{
string sForbidChannel = " <ForbidChannel> 109 </ForbidChannel> <ForbidChanne
l> 111 </ForbidChannel> ";
cout < < "Get forbid channel " < <sForbidChannel < <endl;
m_ForbidChannelList = getIntTagContents(sForbidChannel, " <ForbidChannel
> ", " </ForbidChannel> ");
int i;
for(i=0;i <=100;i++)
{
if (IsForbidChannel (i))
{
cout < < "Skip forbid channel " < <i < <endl;
continue;
}
}


}

[解决办法]
LIBCD.lib这个是干吗的?检查一下
[解决办法]
那个m_ForbidChannelList是main中的一个局部静态变量,怎么能够在IsForbidChannel函数中使用?

修改一下的话,vs2005下编译无问题。

#include <iostream>
#include <string>
#include <list>
#include <algorithm>

using namespace std;

list <int> getIntTagContents (string src, string startTag, string endTag)
{
list <int> contentList;
string::size_type posStartTag, posEndTag;
string::size_type posCurrent = 0;



for(;;)
{
posStartTag = src.find(startTag, posCurrent);
posEndTag = src.find(endTag, posCurrent);

if( posStartTag == string::npos || posEndTag == string::npos )
{
break;
}
else
{
int content = atoi(src.substr(posStartTag+startTag.length(), posEndTag-posStartTag-startTag.length()).c_str());
contentList.push_back(content);
posCurrent = posEndTag + endTag.length();
}
}
return contentList;
}

bool IsForbidChannel(int nChannel, const list <int> & forbidChannelList)
{
list <int> ::const_iterator itrList;

itrList = find(forbidChannelList.begin(), forbidChannelList.end(), nChannel);

if (itrList == forbidChannelList.end())
{
return false;
}
else
{
return true;
}
}

void main()
{
list <int> m_ForbidChannelList;
string sForbidChannel = " <ForbidChannel> 109 </ForbidChannel> <ForbidChannel> 111 </ForbidChannel> ";
cout < < "Get forbid channel " < <sForbidChannel < <endl;
m_ForbidChannelList = getIntTagContents(sForbidChannel, " <ForbidChannel> ", " </ForbidChannel> ");
for(int i=0;i <=100;i++)
{
if (IsForbidChannel (i, m_ForbidChannelList))
{
cout < < "Skip forbid channel " < <i < <endl;
continue;
}
}

}
[解决办法]
另外,LIBCD.lib这个库文件是单线程调试模型下使用的默认链接运行库之一,不需要的话,在链接选项里面忽略掉这个库文件
[解决办法]
不知你用的什么编译器,在我的VC7.1上你这个程序远不止于你所提出的那些链接错误,同时还有许多编译错误,所以我很怀疑你提出问题的准确性,不好回答....
[解决办法]
这个我也遇到过,主要是C运行时和C++运行时的冲突。
在VC的C++选项里面有没有这些个东西。我也是在网上找到的。
/MTd /W3 /Gm
不知道对不对。
[解决办法]
重新建立工程。。。
[解决办法]
你可以在这看看,这是我以前遇到这个问题时找到的资料
http://blog.chinaunix.net/u/18331/showart.php?id=137712
[解决办法]
解决外部符号错误:_main,_WinMain@16,__beginthreadex )
在创建MFC项目时, 不使用MFC AppWizard向导, 如果没有设置好项目参数,就会在编译时产生很多连接错误, 如error LNK2001错误, 典型的错误提示有:
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex n
1. Windows子系统设置错误, 提示:
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main

Windows项目要使用Windows子系统, 而不是Console, 可以这样设置:

[Project] --> [Settings] --> 选择 "Link "属性页,
在Project Options中将/subsystem:console改成/subsystem:windows

2. Console子系统设置错误, 提示:
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16

控制台项目要使用Console子系统, 而不是Windows, 设置:

[Project] --> [Settings] --> 选择 "Link "属性页,
在Project Options中将/subsystem:windows改成/subsystem:console

3. 程序入口设置错误, 提示:
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16

通常, MFC项目的程序入口函数是WinMain, 如果编译项目的Unicode版本, 程序入口必须改为wWinMainCRTStartup, 所以需要重新设置程序入口:



[Project] --> [Settings] --> 选择 "Link "属性页,
在Category中选择Output,
再在Entry-point symbol中填入wWinMainCRTStartup, 即可

4. 线程运行时库设置错误, 提示: @: kAF n
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex

这是因为MFC要使用多线程时库, 需要更改设置:

[Project] --> [Settings] --> 选择 "C/C++ "属性页, ')
在Category中选择Code Generation,
再在Use run-time library中选择Debug Multithreaded或者multithreaded
咸鱼游侠(75374355) 12:11:11
其中,
Single-Threaded 单线程静态链接库(release版本)
Multithreaded 多线程静态链接库(release版本)
multithreaded DLL 多线程动态链接库(release版本)
Debug Single-Threaded 单线程静态链接库(debug版本)
Debug Multithreaded 多线程静态链接库(debug版本)
Debug Multithreaded DLL 多线程动态链接库(debug版本)

单线程: 不需要多线程调用时, 多用在DOS环境下
多线程: 可以并发运行
静态库: 直接将库与程序Link, 可以脱离MFC库运行
动态库: 需要相应的DLL动态库, 程序才能运行
release版本: 正式发布时使用
debug版本: 调试阶段使用


[解决办法]
这是从MSDN上找来的.


允许您指示多线程模块是否是 DLL,并可以选择运行时库的零售版本或调试版本。


/MD[d]
/MT[d]
/LD[d]


备注
选项 说明
/MD
使应用程序使用运行时库的多线程并特定于 DLL 的版本。定义 _MT 和 _DLL,并使编译器将库名 MSVCRT.lib 放入 .obj 文件中。

用此选项编译的应用程序静态链接到 MSVCRT.lib。该库提供允许链接器解析外部引用的代码层。实际工作代码包含在 MSVCR80.DLL 中,该库必须在运行时对于与 MSVCRT.lib 链接的应用程序可用。

当在定义了 _STATIC_CPPLIB (/D_STATIC_CPPLIB) 的情况下使用 /MD 时,它将导致应用程序与静态多线程标准 C++ 库 (libcpmt.lib) 而非动态版本 (msvcprt.lib) 链接,同时仍通过 msvcrt.lib 动态链接到主 CRT。

/MDd
定义 _DEBUG、_MT 和 _DLL,并使应用程序使用运行时库的调试多线程并特定于 DLL 的版本。它还使编译器将库名 MSVCRTD.lib 放入 .obj 文件中。

/MT
使应用程序使用运行时库的多线程静态版本。定义 _MT 并使编译器将库名 LIBCMT.lib 放入 .obj 文件中,以便链接器使用 LIBCMT.lib 解析外部符号。

/MTd
定义 _DEBUG 和 _MT。此选项还使编译器将库名 LIBCMTD.lib 放入 .obj 文件中,以便链接器使用 LIBCMTD.lib 解析外部符号。

/LD
创建 DLL。

将 /DLL 选项传递到链接器。链接器查找 DllMain 函数,但并不需要该函数。如果没有编写 DllMain 函数,链接器将插入返回 TRUE 的 DllMain 函数。

链接 DLL 启动代码。

如果命令行上未指定导出 (.exp) 文件,则创建导入库 (.lib);将导入库链接到调用您的 DLL 的应用程序。

将 /Fe(命名 EXE 文件)解释为命名 DLL 而不是 .exe 文件;默认程序名成为 basename.dll 而不是 basename.exe。

除非显式指定 /MD,否则将暗指 /MT。

/LDd
创建调试 DLL。定义 _MT 和 _DEBUG。


有关 C 运行时库以及使用 /clr(公共语言运行库编译)进行编译时要使用哪些库的更多信息,请参见 C Run-Time Libraries。

传递给链接器的给定调用的所有模块都必须使用相同的运行时库编译器选项(/MD、/MT、/LD)进行编译。

有关使用运行时库的调试版本的更多信息,请参见 Run-Time Library Reference。

知识库文章 Q140584 也讨论如何选择适当的 C 运行时库。

有关 DLL 的进一步讨论,请参见 DLL。

在 Visual Studio 开发环境中设置此编译器选项
打开该项目的“属性页”对话框。有关详细信息,请参见如何:打开项目属性页。

单击“C/C++”文件夹。

单击“代码生成”属性页。

修改“运行时库”属性。

以编程方式设置此编译器选项
请参见 RuntimeLibrary。

读书人网 >C++

热点推荐