使用 NMAKE 编译 VC++ DLL

Posted

技术标签:

【中文标题】使用 NMAKE 编译 VC++ DLL【英文标题】:VC++ DLL compilation using NMAKE 【发布时间】:2014-06-16 09:10:00 【问题描述】:

我有一个使用 Visual Studio 2005 编译的 DLL 文件,当我从 C# 程序调用这些函数(在 DLL 中)时,它运行良好。但是,如果我使用 NMAKE 编译相同的程序,它会成功编译,但它不适用于 C# 程序。我收到“DLL NOT FOUND EXCEPTION”或“DLL IS CORRUPT”。

P.S:我从原始项目文件中复制了所有编译器选项和链接器选项,并在 MakeFile 中使用了它,但仍然没有用。我在这里错过了什么?

编译器和链接器选项如下:

Compiler opt: /O2 /Ob1 /D "WIN32" /D "NDEBUG" /D "_WRITE_LOGS" /D "_VC80_UPGRADE=0x0700" /D "_WINDLL" /D "_MBCS" /Fo"obj\\" /FD /EHsc /MD /W3 /nologo /c /Gz /TP /errorReport:prompt 

Linker opt: /OUT:"dll/XXX.dll" /INCREMENTAL:NO /NOLOGO /DLL /DEF:"src\XXX.def" /DELAY:UNLOAD /MACHINE:X86 /ERRORREPORT:PROMPT mqrt.lib ..(other lib files)..

编辑:如果我使用dumpbin,使用NMAKE编译的DLL中“HEADERS”、“EXPORTS”、“SYMBOLS”的大小都比DLL小使用 Visual Studio 编译!

【问题讨论】:

【参考方案1】:

我发现了我的错。我只是没有包括实际编译的一部分。我猜的重要部分。

将清单文件嵌入 DLL

Mt.exe 文件是一种生成签名文件和目录的工具。我找到了this link,它非常有用。

PS:我学到了这一点。编译 DLL 的三个重要部分是,

编译器(CL.exe) 链接器(LINK.exe) 嵌入清单 (MT.exe)

【讨论】:

使用 mt.exe 实际上是把 .def 文件与 DLL 一起显示出来,从而帮助其他应用程序找到 DLL 中的函数。

以上是关于使用 NMAKE 编译 VC++ DLL的主要内容,如果未能解决你的问题,请参考以下文章

如何用 Nmake 编译?

Nmake构建失败

将 C 编译从 MinGW 移植到 VisualStudio(nmake)

fluent中的UDF能用vs2010编译吗?

VS2012 nmake使用v110_xp工具集?

VC6.0编译DLL,使用VS2010调用问题及解决方法