如何为 Windows 上构建的 libxml2.dll 生成清单文件?

Posted

技术标签:

【中文标题】如何为 Windows 上构建的 libxml2.dll 生成清单文件?【英文标题】:How do I generate a manifest file for libxml2.dll built on Windows? 【发布时间】:2016-10-30 02:42:52 【问题描述】:

编译libiconv后我在Windows上成功编译了libxml2:

http://www.codeproject.com/Articles/302012/How-to-Build-libiconv-with-Microsoft-Visual-Studio

并遵循本教程:

http://marlowa.blogspot.com/2013/07/how-to-build-libxml2-on-windows-using.html

现在我正在尝试为 libxml2.dll 生成清单文件。我该怎么做呢?我用谷歌搜索了一下,它说要在 Visual Studio 中创建清单文件,但我是从命令行编译的。这是我用来构建它的脚本:

@ECHO OFF
CALL "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat"
CD libxml2-2.9.4\win32
cscript configure.js compiler=msvc prefix=D:\Repos\libxml2\release include=D:\Repos\libiconv\release\include lib=D:\Repos\libiconv\release debug=yes
REM "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"
nmake
nmake install
cd ../..

我的插件的这一行出现“未找到模块”异常,我确认这是 libxml2.dll 的问题,因为使用下载的 libxml2.dll 二进制文件,它工作正常。

https://github.com/NobleUplift/TeamSpeak3WebsitePreview/blob/master/ts3websitepreview/plugin.c#L148

任何和所有的帮助表示赞赏。我几乎完成了这个自 2011 年以来一直在开展的项目。

左侧的 libxml2.dll 有效。右侧是编译好的libxml2.dll。事实证明,正在编译的 libxml2 没有 zlib1 依赖项,这可能是问题所在。

【问题讨论】:

没有什么理由需要 libxml2 的清单文件。它是用纯 C 编写的,不使用 COM,不需要修改。 @HansPassant 好吧,我有一个下载的 libxml2 二进制文件(我在 Windows 上编译的唯一原因是缺少 64 位二进制文​​件下载),如果我将它分回我的 Win32 版本,我的程序可以工作,但是如果我使用我编译的 libxml2,程序会立即崩溃。我尝试动态链接已编译的 libxml2.dll 是否重要? 你必须使用调试器而不是随机猜测。 @HansPassant 不过这不是随机猜测;我只是按照 Andrew Marlow 博客中的说明进行操作。奇怪的是我创建了一个测试项目并将代码作为控制台应用程序运行,它运行得很好,但是当我编译它以在我的插件中运行时,我得到一个“找不到模块”异常here。跨度> @HansPassant,我添加了一个依赖walker的截图。似乎我正在编译的 libxml2 没有 zlib1。我会尝试将其纳入编译中,看看是否可以解决它。 【参考方案1】:

在运行cscript configure.js之后和运行nmake之前,编辑生成的Makefile并将/MANIFEST添加到LDFLAGS

【讨论】:

我回家后试试这个。 我添加了/MANIFEST 标志,但似乎找不到生成的清单文件。我的win32 目录中有bin.msvcint.a.dll.msvcint.a.msvcint.utils.msvcVC10wince 文件夹,但没有.mf/.manifest/@987654333 忽略以上,我忘记运行nmake clean,然后再次运行cscript。我有清单文件,现在我将尝试嵌入。谢谢! 尼克,我们有一个vcmanifest=yes|no 开关,为什么要手动添加一个? (见我的回答) @MartinBa vcmanifest 开关似乎仅在存在清单文件时才运行 mt.exe。当我使用 MSVC10 进行测试时,如果没有 /MANIFEST 选项,则不会创建任何清单。但老实说,我从未使用过清单文件,所以我不知道我在说什么。【参考方案2】:

(a) 据我所知,当前 (2.9.4) 配置脚本有一个 vcmanifest=yes|no 选项确实有效。

(b) 你不需要。清单(如noted in the blog you link to)对于vc80(VS 2005)和vc90(VS2008)是必需的,因为在这些studio 版本,msvcrt 是通过 manifest / WinSxS 解决的。

在vc10/Studio 2010及以上版本中,msvcrt再次安装在Windows\System32位置,不需要manifest来加载crt。

从您的 dep-walker 屏幕截图中,您实际上缺少的是 iconv.dll 和 zlib1.dll,它们也不需要清单,但除非您使用 iconv=no zlib=no 编译(可能不需要成为你想要的)。

【讨论】:

我将 zlib1 问题移至 this question here,但我使用的是 zlib=yes,并且它没有在 Dependency Walker 中显示 zlib 链接。

以上是关于如何为 Windows 上构建的 libxml2.dll 生成清单文件?的主要内容,如果未能解决你的问题,请参考以下文章

Electron builder - 如何为生产 Windows 可执行文件构建 loadURL

在 Win32 中构建最新的 iconv 和 libxml2 二进制文件

如何为使用 sbt native packager 构建的应用程序指定 java.library.path?

如何为 localhost 网站配置 IIS 7?

如何为 Windows 中的进程分配超过 2GB 的内存?

如何为ios构建skia