LNK2001的错误信息,而且libcmt.lib 和 msvcrt.lib 加入后无效
我在强迫生成.exe 后程序功能没有变化,但是错误的信息无法消除。
这里给出详细信息,麻烦大家了:
//------------------ code ------------------
// 写一个程序读入任意个文件,这些文件的文件名以命令行参数给出,然后把他 们一个接一个地输出到cout流中。
void cat(char* pFileName)
{
CFile f;
CFileException e;
if( !(f.Open(pFileName , CFile::modeRead | CFile::shareDenyRead, &e ) ) )
{
#ifdef _DEBUG
afxDump << " File could not be opened " << e.m_cause << endl;
#endif
cout<<" Error open file: "<<pFileName<<endl;
exit(2);
}//End of if
if(f.GetLength()>=100)
{
cout<<"File length must less than 100!"<<endl;
exit(2);
}//End of if
char pbuf[110];
unsigned ReadLength=f.Read(pbuf,100);
unsigned SteadyNum=ReadLength;
while((ReadLength--)>0)
cout<<pbuf[SteadyNum-ReadLength-1];
f.Close();
}//End of cat
//-------------------
void main(int argc,char **argv)
{
while(--argc>0)
cat(*++argv);
}//Endof main
//-------------------
问题点数:15、回复次数:3Top
1 楼zhq2000(方舟)回复于 2001-01-26 04:18:00 得分 15
libcmt.lib 和 msvcrt.lib 是Release版库。
你是不是用Debug方式编译,如是,用它们的Debug版库libcmtd.lib 和 msvcrtd.lib 。
如是用Release方式编译,则…………………… :-( 我不知道了!Top
2 楼isearthling(凡夫俗子)回复于 2001-02-01 09:01:00 得分 0
你给了一个很好的提示,我试了一下,将Project->Setting->General 中的No MFC 改为 MFC
就可以了,谢谢。Top
3 楼javaonline(discoverer)回复于 2001-03-07 17:56:00 得分 0
我刚好也碰到了这个问题,我查了一下 MSDN
出现这个错误的原因是你在你的程序中使用了 CRT 函数所致,而且,这个错误只出现在Release 中,解决的方法有两种:
一:找出你所的 CRT 函数,改用非 CRT 函数
二:去掉预编译 _ATL_MIN_CRT 就可以了,但是这样以来就会增加编译后文件的大小,大概几十 K 的样子。
原文如下:
INFO: LNK2001 Error ATL Release Build
ID: Q165076
--------------------------------------------------------------------------------
The information in this article applies to:
Microsoft Active Template Library, versions 2.0, 2.1, 3.0
--------------------------------------------------------------------------------
SUMMARY
Microsoft Active Template Library COM AppWizard generates a release build of your project using macro _ATL_MIN_CRT. Selecting this configuration causes the C run-time (CRT) library startup code to not be linked into your project. If you use functions or code in your project that require the use of the C run-time library startup code, you may experience LNK2001 - unresolved external errors when you try to build the release version of your project.
MORE INFORMATION
You can use some C run-time functions without requiring the CRT startup code. Examples include the mem* functions. Other functions require the CRT startup code. CRT string comparisons for example require the startup code as the CRT initializes some tables used for comparing. Global objects that have constructors also require the startup code. In Visual C++ 5.0, statically linking the startup code adds about 25K to your image (in Visual C++ 4.2 it is about 20K).
Following are some suggestions for finding the cause of the LNK2001 errors:
In the linker options there is an "ignore libraries" edit box. Enter Libcmt.lib into it, and build. You get several unresolved externals. This list is everything that you are using from the CRT. Look for things that you think may be pulling in the startup code and remove them if you can.
Don't ignore Libcmt.lib, but turn on the verbose flag for the linker. From this, you can see what is triggering CRT startup code to get pulled in.
If you decide that you really need the startup code, then remove the _ATL_MIN_CRT define from the project settings. You can also dynamically link to the CRT, which reduces your image size but requires the CRT's DLL. If you turn on exception handling you have to pull in the startup code. Even when building minsize the default is to statically link to the CRT and use _ATL_MIN_CRT. Top




