avatar
Today is 星期天
2010年09月5日

2010年04月29日

链接静态MFC库时要注意

由 晨笛 — 分类目录: C/C++评论暂缺

今天需要给公司同事做个办公用的小软件,由于项目简单,根据经验做就行,也就没做太多规划,窗口系统就用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 也可以。

评论暂缺 »

还没有任何评论。

留下评论

XHTML: 您可以选用这些标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">

© 2010 晨笛的博客 All rights reserved - Wallow theme by TwoBeers Crew - Powered by WordPress - 使用愉快!