关于多线程处理---难道又是编译器问题?

linghushaonian 2002-09-25 03:03:01
在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) 中被引用

各位有谁知道是什么原因吗?
...全文
38 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenm001 2002-09-25
  • 打赏
  • 举报
回复
去掉default library选项然后自己增加LIB就没有问题了
wxdnuaa 2002-09-25
  • 打赏
  • 举报
回复
这样的错误表示这些函数有声明有使用,就是没有实现。
你缺少了必要的库。
realdreamer 2002-09-25
  • 打赏
  • 举报
回复
设置你的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 库名嵌入对象文件中。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧