今天需要给公司同事做个办公用的小软件,由于项目简单,根据经验做就行,也就没做太多规划,窗口系统就用MFC来做了。不想在发行时附带VC内部的几个DLL,就把项目设置为use MFC in a static library,结果出现了一些错误,在网上搜索得到以下解决办法:
链接错误
nafxcw.lib(afxmem.obj) :error LNK2005: “void * __cdecl operator new(unsigned int)”(??2@YAPAXI@Z) already defined in LIBCMT.lib(new.obj)
这是因为VC的编译器在编译程序时有两个习惯:
a、在从头开始编译时,将源文件名按字母排序后,依次处理。
b、一边编译一边决定需要哪些缺省库。
C运行时库(CRT)和Microsoft基础类库(MFC)的链接顺序有误。CRT库对new、delete、DllMain函数使用弱外部链接,MFC库包含new、delete、DllMain函数,这些函数要求先链接MFC库,然后再链接CRT库。
强制链接器按照正确的顺序链接库。
Project ->setting ->Link : category ->Input
Ignore libraries: nafxcw.lib ; libcmt.lib
Object/library modules:nafxcw.lib ; libcmt.lib
注意顺序,前者为MFC静态链接库,后者为C运行时库。
使用MFC库时,务必先链接它们,然后再链接CRT库。这可以通过确保项目中的每个文件都首先包含 Msdev\Mfc\Include\Afx.h 来完成。直接包含(#include <Afx.h>)或间接包含(#include <Stdafx.h>)都可以。Afx.h包含文件会通过使用#pragma comment (lib,”<libname>”)指令来强制采用库的正确顺序。
连接时警告
warning LNK4089: all references to “SHELL32.dll” discarded by /OPT:REF
链接器工具警告 LNK4089/OPT:REF 已丢弃所有对“动态链接库”的引用,链接器放弃了引用 dynamic-link library 中的导出的所有封装函数。
如果代码中未使用的函数引用链接器已放弃的DLL导出,也会出现此警告。用#pragma comment(linker,”/ignore:4089)可以取消警告。
在project->settings->linking->projects options中加上/OPT:NOREF 也可以。
