现在的位置: 首页 > 综合 > 正文

Use run-time library 设置问题

2018年02月12日 ⁄ 综合 ⁄ 共 2653字 ⁄ 字号 评论关闭

使用库时常出现的错误, 提示: 基本是库和程序选择的run-time ibrary不同引起的.

LIBCMT.lib(crt0dat.obj) : error LNK2005: _exit already defined in MSVCRTD.lib

 

(MSVCR80D.dll)

LIBCMT.lib(crt0dat.obj) : error LNK2005: __exit already defined in MSVCRTD.lib

 

(MSVCR80D.dll)

LIBCMT.lib(crt0dat.obj) : error LNK2005: __cexit already defined in MSVCRTD.lib

 

(MSVCR80D.dll)

 

使用第三方的库造成的。这种情况主要是C运行期函数库和MFC的库冲突造成的。具体的办法就是将那

 

个提示出错的库放到另外一个库的前面。另外选择不同的C 函数库,可能会引起这个错误。微软和C有

 

两种C运行期函数库,一种是普通的函数库:LIBC.LIB,不支持多线程。另外一种是支持多线程的: 

 

msvcrt.lib。如果一个工程里,这两种函数库混合使用,可能会引起这个错误,一般情况下它需要MFC

 

的库先于C运行期函数库被链接,因此建议使用支持多线程的msvcrt.lib。所以在使用第三方的库之前

 

首先要知道它链接的是什么库,否则就可能造成LNK2005错误。如果不得不使用第三方的库,可以尝试

 

按下面所说的方法修改,但不能保证一定能解决问题,前两种方法是微软提供的: 

A、选择VC菜单Project->Settings->Link->Catagory选择Input,再在Ignore   libraries   的Edit

 

栏中填入你需要忽略的库,如:Nafxcwd.lib;Libcmtd.lib。然后在Object/library   Modules的Edit

 

栏中填入正确的库的顺序,这里需要你能确定什么是正确的顺序.(最好不要这么做) 

B、选择VC菜单Project->Settings->Link页,然后在Project   Options的Edit栏中输入/verbose:lib

 

,这样就可以在编译链接程序过程中在输出窗口看到链接的顺序了。 

C、选择VC菜单Project->Settings->C/C++页,Catagory选择Code   Generation后再在User   

 

Runtime   libraray中选择MultiThread   DLL等其他库,逐一尝试。 

关于编译器的相关处理过程,参考: 

http://www.donews.net/xzwenlan/archive/2004/12/23/211668.aspx

 

 

warning LNK4098: defaultlib "LIBCMT" conflicts with use of other libs ;use 

 

/NODEFAULTLIB:library(出现警告最好调整程序或库使用相同的运行库,要不就忽略一些,不处理)

 

The table below shows which libraries should be ignored depending on which run-time 

 

library you want to use.(下面这张表显示了不同运行库使用的lib和要忽视的lib).

 

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

 

 

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版本: 调试阶段使用

抱歉!评论已关闭.