我正在尝试将我的程序与静态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
之外,我是否需要指定任何其他库名称或预处理器定义?
答案 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.lib
和mfcs100d.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构建”部分。
一个问题可能是您已经以某种方式设置了第三方库,然后您必须在设置中遵循这种方式。另一个问题是如果你有两个这样的库,但它们以不同的方式设置。然后将它们连接在一起是不可能的。如果这涉及到你,我会扩大答案。