如何使用Microsoft链接器工具

时间:2015-12-27 09:59:56

标签: c++ makefile mfc nmake

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

!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):错误LNK2005:&#34; void __cdecl运算符 删除(void *)&#34; (?? 3 @ YAXPAX @ Z)已经定义了 mfc100d.lib(mfc100d.dll)

  • LINK:警告LNK4098:defaultlib&#39; nafxcwd.lib&#39;与使用冲突 其他图书馆; use / NODEFAULTLIB:library

  • mfcs100d.lib(appmodul.obj):警告LNK4217:本地定义的符号 __setmbcp在函数中导入&#34; int __stdcall AfxInitialize(int,unsigned long)&#34; (?AfxInitialize @@ @ YGHHK Z)

  • window.exe:致命错误LNK1169:一个或多个多重定义 找到的符号

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

1 个答案:

答案 0 :(得分:1)

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

MFC链接到您的app的方式必须与CRT链接的方式相同。 MFC链接在您的项目属性中设置&gt;配置属性&gt;一般&gt; 使用MFC 。静态和动态链接有两种选择。

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

只需匹配这两个选项,问题应该消失(或者如果您遇到多个问题,那么至少输出版本中的文本应该更改)。

nmake项目中,如果要链接到静态MFC,则不要将mfc100d.libmfcs100d.lib库链接到项目,因为这些库用于动态链接。链接到nafxcwd.lib for Debug(您已经链接,否则不会有任何错误),或nafxcw.lib for Release。此外,必须定义_AFX宏,并且必须有一个选项/MT for Release,或/MTd for Debug build。

但是,如果要动态链接MFC,则定义_AFXDLL宏,并添加选项/MD(对于Release)或/ MDd(对于Debug构建)。有关详细信息,请参阅Microsoft技术说明TN033中的“使用NMAKE构建”部分。

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