C++ 如何使用Microsoft链接器工具链接静态MFC库

C++ 如何使用Microsoft链接器工具链接静态MFC库,c++,makefile,mfc,nmake,C++,Makefile,Mfc,Nmake,我正在尝试将我的程序与静态MFC库链接,如我的makefile中的以下目标代码所示(其余部分已编写): !包括 全部: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会停止链接过程并显示

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

!包括
全部: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):错误LNK2005:“void\uu cdecl运算符 删除(作废*)“(??)??3@YAXPAX@Z) 已在中定义 mfc100d.lib(mfc100d.dll)

  • 链接:警告LNK4098:defaultlib'nafxcwd.lib'与使用冲突 其他伦敦银行同业拆借利率;使用/NODEFAULTLIB:library

  • mfcs100d.lib(appmodul.obj):警告LNK4217:本地定义的符号 __在函数“int u stdcall AfxInitialize(int,unsigned long)”中导入的setmbcp(?AfxInitialize@@YGHHK@Z)

  • window.exe:致命错误LNK1169:定义了一个或多个乘法运算 找到的符号


除了告诉Microsoft链接工具忽略
nafxcwd.lib
,我还需要指定任何其他库名称或预处理器定义吗?

首先:不要使用NODEFAULTLIB选项。在这个阶段,它并不适合你。这很重要。你必须调整其他选项

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

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

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

nmake
project中,如果要链接到静态MFC,则不要将
mfc100d.lib
mfcs100d.lib
库链接到项目,因为这些库用于动态链接。链接到
nafxcwd.lib
进行调试(您已经在链接,否则不会出现任何错误),或链接到
nafxcw.lib
进行发布。此外,必须定义
\u AFX
宏,并且必须有一个选项
/MT
用于发布或调试构建

但是,如果要动态链接MFC,请定义
\u afxdl
宏,并添加选项
/MD
(用于发布)或/MDd(用于调试生成)。有关更多信息,请参阅Microsoft技术说明中的“使用NMAKE构建”部分


一个问题可能是您有一个第三方库,它已经以某种方式设置好了,您必须按照这种方式进行设置。另一个问题是,如果您有两个这样的库,但它们的设置方式不同。那么就不可能把它们联系在一起了。如果这与您有关,我将扩展答案。

我安装了Windows SDK和Visual Studio 2010,但我的代码不在项目中。有没有办法在命令行上使用MFC支持编译我的代码?@edition抱歉,完全错过了在nmake中完成的任务。编辑了答案。
!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)