在vc.net中完成一读者写者问题的程序,编译通过,运行时却提示:os1 fatal error LNK1120: 2 个无法解析的外部命令1.os1 error LNK2005: "void __cdecl operator delete(void *,int,char const *,int)" (??3@YAXPAXHPBDH@Z) 已经在 nafxcwd.lib(afxmem.obj) 中定义
2.os1 error LNK2019: 无法解析的外部符号 __endthreadex ,该符号在函数 "void __stdcall AfxEndThread(unsigned int,int)" (?AfxEndThread@@YGXIH@Z) 中被引用
3.os1 error LNK2019: 无法解析的外部符号 __beginthreadex ,该符号在函数 "public: int __thiscall CWinThread::CreateThread(unsigned long,unsigned int,struct _SECURITY_ATTRIBUTES *)" (?CreateThread@CWinThread@@QAEHKIPAU_SECURITY_ATTRIBUTES@@@Z) 中被引用各位有谁知道是什么原因吗?

解决方案 »

  1.   

    设置你的C 运行时库为多线程的.线程 C 库:LIBCMT.LIB 和 MSVCRT.LIB
    支持库 LIBCMT.LIB 是可重入库,用于创建多线程程序。调用共享的 MSVCRT70.DLL 中代码的 MSVCRT.LIB 库也是可重入库。当应用程序调用这些库中的函数时,可以应用下列规则: 所有库调用必须使用 C (__cdecl) 调用约定;使用其他调用约定(如 __fastcall 或 __stdcall)编译的程序必须使用它们调用的运行时库函数的标准包含文件。 
    传递到库函数的变量必须由值传递或转换为指针。 
    使用 LIBCMT.LIB 生成的程序不与它们所调用的任何动态链接库共享 C 运行时库代码或数据。LIBCMT.LIB 和 MSVCRT.LIB 以外的其他选择
    如果不使用 LIBCMT.LIB 来生成多线程程序,必须执行下列操作: 使用标准 C 库并且只允许可重入函数集进行库调用。 
    使用 Win32 API 线程管理函数,如 CreateThread。 
    通过使用 Win32 服务(如信号灯和 EnterCriticalSection 和 LeaveCriticalSection 函数),为不可重入的函数提供自己的同步。 
    警告 多线程库 LIBCMT.LIB 包括 _beginthread 和 _endthread 函数。_beginthread 函数执行初始化,若没有该函数,许多 C 运行时函数将失败。如果要调用 C 运行时函数,必须使用 C 程序中用 LIBCMT.LIB 生成的 _beginthread,而不是 CreateThread。
    多线程库编译选项
    若要生成使用 C 运行时库的多线程应用程序,必须通知编译器使用特殊版本的库 (LIBCMT.LIB)。若要选择这些库,请首先打开项目的属性页对话框(“视图”菜单)并单击 C/C++ 文件夹。选择“代码生成”页。从“运行时库”下拉框中选择“多线程”。单击“确定”按钮以返回编辑状态。命令行中的多线程库编译器选项 (/MT) 是用 LIBCMT.LIB 生成多线程程序的最佳途径。在创建新项目的过程中指定多线程应用程序时,自动设置此选项,此选项将 LIBCMT 库名嵌入对象文件中。
      

  2.   

    去掉default library选项然后自己增加LIB就没有问题了