1

我需要为我的TeamSpeak 3 插件编译 libxml2 32 位和 64 位二进制文​​件,因为我找不到 dll/lib 64 位下载。当我在命令提示符应用程序中使用我编译的 libxml2.dll 作为依赖项时,它工作得很好。但是,当我尝试将它用作 TeamSpeak 3 中的依赖项时,程序在启动时立即崩溃。具体来说,它在这一行崩溃:

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

这是我在 Windows 上编译 libxml2 的批处理脚本:

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

工作的 libxml2.dll 位于左侧,损坏的 libxml2 位于右侧

左边下载的 libxml2.dll 可以工作。右侧是编译好的libxml2.dll。我尝试使用 zlib 标志,并将我的 zlib 标头放在包含目录中,并将 dll/lib 放在 lib 目录中,但我无法将它链接到 DLL 中。

4

1 回答 1

1

好吧,我不知道你的有什么问题,但这是我们编译发布版本的方式:

set TARGET_DIR=.\release_vc100
cscript configure.js compiler=msvc cruntime=/MD debug=no iconv=no legacy=no vcmanifest=no prefix=%TARGET_DIR% || exit /B 1
nmake /f Makefile.msvc clean || exit /B 1
nmake /f Makefile.msvc MSVC_VERSION=vc100 || exit /B 1
nmake /f Makefile.msvc install || exit /B 1

我猜你不想要iconv=no,但我会注意到我明确指定/MD了动态链接发布 msvcrtdebug=no以及传递MSVC_VERSION=vc100给 make 步骤。

我还注意到您zlib=true在选项似乎采取时通过了yes|no- 我确实认为“真”不会被解释为 1,而是作为 0。(!= yes

再次查看您的 depwalker 输出,我不知何故怀疑您丢失的MSVC_VERSION开关实际上可能是一个问题,因为 depwalker 列出了一个丢失的LIBiconv.dll并且命名方案(动态对象的 LIB 前缀)是 *nix 的事情,据我所知。)

至于您的错误行——dll 加载失败——两个 depwalker 屏幕截图都显示缺少依赖 DLL 文件:

  • 左侧:iconv.dllzlib1.dll 正在运行

  • 右侧:LIBiconv.dll 丢失。(但我认为Windows上没有libiconv.dll,所以肯定有一些错误的链接器设置(??)。


我也明确地传递了makefile,但这可能只是我们尝试了一些定制的makefile的先前版本的遗留物。

旁注:调试版本为:

cscript configure.js compiler=msvc cruntime=/MDd debug=yes iconv=no legacy=no vcmanifest=no prefix=%TARGET_DIR% || exit /B 1
于 2016-11-25T20:57:15.367 回答