VC6.0静态编译注意事项
选择静态编译(工程->常规->Microsoft基础类->使用MFC作为静态链接库)的时候,会报错:MSVCRTD.lib(MSVCRTD.dll) : error LNK2005: _sprintf already defined in LIBCMTD.lib(sprintf.obj)报错的意思及原因是使用的某些外部静态库编译时使用的标准库和当前工程使用的标准库冲突。
所以需要设置标准库并忽略一些库:
首先需要设置run-time library
工程->设置->C++->Code Generation->Use run-time library
可供选择的Use run-time library有6项:Single-threaded、Multithreaded、Multithreaded using DLL、Debug Single-threaded、Debug Multithreaded、Debug Multithreaded using DLL。
不同的Use run-time library对应地忽略不同的库文件。对应关系如下:
|
|
---|---|
Single-threaded (libc.lib)单线程静态链接库(release版本) libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib |
|
Multithreaded (libcmt.lib)多线程静态链接库(release版本) libc.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib |
|
Multithreaded using DLL (msvcrt.lib)多线程动态链接库(release版本) libc.lib, libcmt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib |
|
Debug Single-threaded (libcd.lib)单线程静态链接库(debug版本) libc.lib, libcmt.lib, msvcrt.lib, libcmtd.lib, msvcrtd.lib |
|
Debug Multithreaded (libcmtd.lib)多线程静态链接库(debug版本) libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, msvcrtd.lib Debug Multithreaded using DLL (msvcrtd.lib)多线程动态链接库(debug版本) |
|
libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib 如何忽略呢? 工程->设置->连接->输入->忽略库->即可。 不同的编译方式有什么差异呢?
单线程: 不需要多线程调用时, 多用在DOS环境下 对应地忽略这些库之后,会产生一个新的问题: nafxcwd.lib(appcore.obj) : error LNK2001: unresolved external symbol ___argv
nafxcwd.lib(appcore.obj) : error LNK2001: unresolved external
symbol ___argc 这个问题如何解决呢? 工程->设置->C/C++->预处理器->预处理器定义 _AFXDLL。 问题就解决了。 |