编译常见错误

来源:互联网 发布:织梦cms视频教程下载 编辑:程序博客网 时间:2024/05/01 13:14

 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

     建议是把所有warning解决掉
    在VC6使用STL容器时,会产生一大堆的warning或莫名的error
    如:fatal error C1063:
5. vc中对标准库std::min,max,swap的不支持问题
    标准库在<algorithm>头中定义了两个模板函数std::min() 和 std::max()。通常用它可以计算某个值对的最小值和最大值。可惜在 Visual C++ 无法使用它们,因为没有定义这些函数模板。原因是名字min和max与<windows.h>中传统的min/max宏定义有冲突。为了解决这个问题,Visual C++ 定义了另外两个功能相同的模板:_cpp_min() 和 _cpp_max()。我们可以用它们来代替std::min() 和 std::max()。为了禁用Visual C++中的 min/max宏定义,可以在包含<windows.h>头文件之前加上:
#define NOMINMAX
或者将 NOMINMAX 加到 preprocessor difinitions 中。具体方法是:
Visual C++ 6.0: 打开工程文件(*.dsw)或者(*.dsp),选中要定义的工程,进入菜单“Project”=>“Settings”(打开Settings对话框)=> 在左上角的“Setting for”下拉列表框处选择“All configurations”,然后选中“C/C++”标签=>在 “preprocessor difinitions”编辑框中加上“NOMINMAX”即可。
Visual C++ 7.0: 打开工程项目文件(*.sln)或者(*.vcproj),选中要定义的工程项目,进入菜单“项目”=>“属性”(打开项目属性对话框)=>在左上角的“配置”下拉列表框处选择“所有配置”,然后在左边的“属性配置”中选择=>“C/C++”=>“预处理器”=>右边“预处理器定义”处加上“NOMINMAX”。

6. error LNK2005: _DllMain@12 already defined in MSVCRTD.lib(dllmain.obj)
    在 project   setting——C/C++——Preprocessor   definitions   去掉_ATL_MIN_CRT 。
    强制/force:multiple(在 Project/Setting/Link/General中的 Project Options: 加入 /FORCE:MULTIPLE即可),
可以,但还出现提示错, stdafx.h 加入extern "C"{ int _afxForceUSRDLL; },没有了 原因不明

       还有另外一种:

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 libraryIgnore 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


7.msvcrtd.lib(MSVCRTD.dll) : error LNK2005: __itoa already defined in LIBCMTD.lib(xtoa.obj)LINK : warning LNK4098: defaultlib "LIBCMTD" conflicts with use of other libs; use /NODEFAULTLIB:library
Debug/BVideoSrv.exe : fatal error LNK1169: one or more multiply defined symbols foundMSVCRTD.LIB LIBCMTD.LIB
 
而不是 LIBCMTD.LIB MSVCRTD.LIB链接顺序修改下MSVCRTD.LIB LIBCMTD.LIB
 
     在“link”选项卡上的“project option”框中键入 /verbose:lib。查看链接库的顺序。

8 编译error LNK2005: _sprintf already defined in LIBCMT.lib(sprintf.obj)
   修改成 multithreaded DLL   
 
9 开发directshow碰到的错误
在用VC++.net2005 SmartDevice,windows mobile5.0开发dshow时,经常会碰到这样一些错误,在这里把它们总结出来:
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 ULONG0;

}
#endif

3).如果以上办法还在debug时出现错误,可以安装vs.net sp1,就可以解决了.
 

 
Dirctshow出现
MFC/OCX链接Directshow/strmbasd.lib出现的问题unresolved external symbol "class CFactoryTemplate * g_Templates" 
 
 
解决途径,在源码*ctl.cpp加入:
extern "C" 
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(); 
原创粉丝点击