1. defaultlib "library" conflicts with use of other libs; use /NODEFAULTLIB:library
a) /nodefaultlib:"libcmtd.lib"
b) 选择Project -> Setting,出现Project Setting对话框,单击Link标签,在Category下拉菜单中选择Input,在下方的Ignore libraries: 输入框中输入“被忽略的library”框中对应的libs。输入时注意当前Build是什么版本,libs之间用“,”隔开。“Ingore all default libraries”不能勾选。
2. error LNK2001: unresolved external symbol _main解决办法
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) 线程运行时库设置错误, 提示:
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
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版本: 调试阶段使用
3. LINK : warning LNK4075: ignoring /EDITANDCONTINUE due to /INCREMENTAL:NO specification
---解决方法:
project->settings->link-->general, 勾选link incrementally
4. 屏蔽vc6使用STL容器时的warning
在VC6使用STL容器时,会产生一大堆的warning或莫名的error
如:fatal error C1063:
mfcs42d.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in MSVCRTD.lib(dllmain.obj)
mfcs42d.lib(dllmodul.obj) : warning LNK4006: _DllMain@12 already defined in MSVCRTD.lib(dllmain.obj); second definition ignored
做项目时,遇到这个问题,很诡异,因为开始编译链接都是OK的,可是关闭工程再重新build时出现了上面的错误,在网上找了很多方法,大多都是微软的那两个方案,但是我试了没用!!
还有一个网友的办法是:
使用lib命令,从mfcs42d.lib里面解出dllmodul.obj
这个文件加入到link的obj文件里面。
我机子上用lib解不出来,放弃。
最后在codeguru网站上找到了解决办法:
The fix is very simple, just do the following.
1)Select BUILD|SETTINGS
2)In the left hand pane highlight WIN32 Debug
3)Go to the LINK tab
4)Select the INPUT 'category'
5)in the edit box labeled "Ignore Libraries"
type the following two libs
MSVCRTD.lib, mfcs42d.lib (order doesn't matter _here_)
6)Now in the edit box labeled "Object/Library Modules" type the following two libs
mfcs42d.lib, MSVCRTD.lib
MAKE SURE THEY ARE IN THIS ORDER AND THEY ARE LISTED AS THE FIRST & SECOND LIBS IN THE EDIT BOX
7)rebuild and all should be fine. Basically what you did was tell the linker to skip the implied inclusion of these libs, and then manually told it to include them in the specific order mentioned
To use this run-time library | Ignore these libraries |
---|---|
Single-threaded (libc.lib) | libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib |
Multithreaded (libcmt.lib) | libc.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib |
Multithreaded using DLL (msvcrt.lib) | libc.lib, libcmt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib |
Debug Single-threaded (libcd.lib) | libc.lib, libcmt.lib, msvcrt.lib, libcmtd.lib, msvcrtd.lib |
Debug Multithreaded (libcmtd.lib) | libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, msvcrtd.lib |
Debug Multithreaded using DLL (msvcrtd.lib) | libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib |
1).Please use the /MD switch for _AFXDLL buildsPlease use the /MD switch for _AFXDLL builds
解决办法:
将project->properity->c/c++->Code Generation->Use Run-time liberary改为 Multithreaded DLL.
2).error LNK2001: unresolved external symbol "public: virtual unsigned long __cdecl CBaseFilter::NonDelegatingRelease(void)" (?NonDelegatingRelease@CBaseFilter@@UAAKXZ)
解决办法:
将project->properity->c/c++-> Language->Treat wchar_t as Built-in Type设为NO(/Zc:wchar_t-).
但这时会出现一个问题,用MFC时,release没有错误,但是debug会出现问题,这时可以这样做:
#ifdef DEBUG
STDMETHODIMP_(ULONG) NonDelegatingRelease()
{
Return ULONG(0);
}
#endif
3).如果以上办法还在debug时出现错误,可以安装vs.net sp1,就可以解决了.
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
return AfxDllGetClassObject(rclsid, riid, ppv);
}
/
// DllCanUnloadNow
extern "C"
STDAPI DllCanUnloadNow(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
return AfxDllCanUnloadNow();
}