首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Microsoft Linker工具链接静态MFC库

问如何使用Microsoft Linker工具链接静态MFC库
EN

Stack Overflow用户
提问于 2015-12-27 09:59:56
回答 1查看 2.9K关注 0票数 0

我正在尝试将我的程序与静态MFC库链接起来,如makefile中的以下目标代码所示(其余部分已提交):

代码语言:javascript
复制
!include <win32.mak>

all: window.exe

.cpp.obj:
    $(cc) $(cdebug) $(cflags) $(cvars) $*.cpp   

window.exe: window.obj
    $(link) $(ldebug) $(guiflags) -out:window.exe window.obj mfc100d.lib mfcs100d.lib $(winlibs)

不幸的是,nmake停止了链接过程,并显示了以下错误:

  • nafxcwd.lib(afxmem.obj):error LNK2005:“void__cdecl操作符删除(void *)”(??3@YAXPAX@Z)已在mfc100d.lib(mfc100d.dll)中定义。
  • 链接:警告LNK4098: defaultlib 'nafxcwd.lib‘与使用其他库发生冲突;使用/NODEFAULTLIB:library
  • mfcs100d.lib(appmodul.obj):警告LNK4217:在函数"int __stdcall AfxInitialize(int,unsigned LNK4217)“中导入的本地定义的符号__setmbcp (?AfxInitialize@@YGHHK@Z)
  • window.exe :致命错误LNK1169:找到一个或多个已定义符号

除了告诉Microsoft忽略nafxcwd.lib之外,我是否需要指定任何附加的库名或预处理器定义?

EN

回答 1

Stack Overflow用户

发布于 2015-12-27 11:17:24

首先:不要使用NODEFAULTLIB选项。在这个阶段它不是为你准备的。这事很重要。你必须改变其他的选择。

MFC与应用程序的链接方式必须与CRT的链接方式相同。MFC链接设置在项目属性>配置属性>通用>使用MFC中。有两个选项,静态和动态链接。

CRT链接(和编译)设置在项目属性>配置属性> C/C++ >代码生成>运行时库中。应该有四种选择。名称中没有DLL的是用于静态链接的。名称中有DLL的是用于动态链接的。那些名称中有Debug的是用于Debug配置的。

只要匹配这两个选项,问题就会消失(或者如果您有多个问题,那么至少输出构建中的文本应该会改变)。

在nmake项目中,如果您想链接到静态MFC,则不要将mfc100d.lib和mfcs100d.lib库链接到您的项目,因为这些库是用于动态链接的。链接到nafxcwd.lib for Debug (您已经在链接该链接,否则不会出现任何错误),或者nafxcw.lib用于发布。另外,必须定义_AFX宏,并且必须有一个选项,要么是用于发布的/MT,要么是用于调试构建的/MTd。

但是,如果要动态链接MFC,则定义_AFXDLL宏,并添加选项/MD (用于发布)或/MDd (用于调试生成)。有关更多信息,请参见微软技术说明TN033中的“使用NMAKE构建”一节。

一个问题可能是,您有一个已经以某种方式设置的第三方库,然后在您的设置中必须遵循这种方式。另一个问题是如果您有两个这样的库,但是它们是以不同的方式设置的。那就不可能把它们联系在一起。如果这关系到你,我会扩大答案。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34479365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档