windows7 cygwin perl XML::Parser libexpat*:安装失败

Posted

技术标签:

【中文标题】windows7 cygwin perl XML::Parser libexpat*:安装失败【英文标题】:windows7 cygwin perl XML::Parser libexpat* : failing to install 【发布时间】:2021-09-30 04:11:37 【问题描述】:

我的直接问题:尝试使用 cpanm 安装 pel 模块 XML:Parser 失败,显然是由于对 expat-devel 或 libexpat1-dev 或类似的依赖。 (我需要这个 XML::Parser 模块作为最终目标 Spreadsheet::ParseXLSX 模块的依赖项。)

$ cpanm XML::Parser
--> Working on XML::Parser
Fetching http://www.cpan.org/authors/id/T/TO/TODDR/XML-Parser-2.46.tar.gz ... OK
Configuring XML-Parser-2.46 ... ! Configure failed for XML-Parser-2.46. See ~/.cpanm/work/1626990186.1404/build.log for details.
N/A

build.log 文件的相关部分似乎是

Expat must be installed prior to building XML::Parser and I can't find
it in the standard library directories. Install 'expat-devel' (or
'libexpat1-dev') package with your OS package manager. See 'README'.

运行 cygwin setup-x86_64.exe(版本 2.908 或 2.909)我已经安装了“libexpat-devel”和“libexpat1”...没有完全命名为“expat-devel”或“libexpat1-”的软件包列表开发'。

$ cygcheck -c libexpat-devel libexpat1
Cygwin Package Information
Package              Version        Status
libexpat-devel       2.2.6-1        OK
libexpat1            2.2.6-1        OK

我现在已经进行了几次迭代;我相信无论这两个软件包都没有安装,或者安装其中一个或两个软件包,都会以完全相同的方式报告失败。

我在第二台 W7 笔记本电脑上安装了这两个“libexpat-devel”和“libexpat1”软件包(cygcheck 输出是相同的)。在第二台笔记本电脑上,XML::Parser 模块安装成功,依赖 XML:Parser 和 Spreadsheet:ParseXLSX 的 perl 脚本运行成功。

我一直无法弄清楚两者之间有什么区别。 AFAICT 可能(应该?)相关的文件出现在两台笔记本电脑上相同的 cygwin 文件系统位置:

/cygdrive/c/cygwin64/lib/libexpat.a
/cygdrive/c/cygwin64/lib/libexpat.dll.a
/cygdrive/c/cygwin64/lib/pkgconfig/expat.pc
/cygdrive/c/cygwin64/usr/include/expat.h
/cygdrive/c/cygwin64/usr/include/expat_config.h
/cygdrive/c/cygwin64/usr/include/expat_external.h

我查看了其他几个具有相关标题的问题:我发现的大多数线程都是 (a) 几年前的,(b) 讨论使用 apt-get 或等效程序在真实的 Linux 系统上安装软件包。 也许我的 search-fu 没有达到标准,但我最近没有发现任何与可使用 cygwin 安装程序安装的“(lib)expat(1)-dev(el)”软件包的确切命名变体有关的问题-x86_64.exe,虽然我不确定这是问题的根源还是只是分心。

提前感谢您对如何进行的任何启发和/或建议。

【问题讨论】:

尝试从Libs类别安装expat,看看是否有改善。 我尝试使用 Cygwin perl(版本 5.32.0)在 Windows 10 上的 Cygwin 上安装 XML::Parser。我注意到的第一件事是仅仅安装libexpat-dev 是不够的,你还需要libnsl-dev。我还不确定为什么。在此之后我可以生成一个Makefile(从源目录运行perl Makefile.PL)。 ... 但是,运行 make 失败并出现 g++ --shared -Wl,--enable-auto-import -Wl,--export-all-symbols -Wl,--enable-auto-image-base -fstack-protector-strong Parser.o -o blib/arch/auto/XML/Parser/Parser.dll /usr/lib/perl5/5.32/x86_64-cygwin-threads/CORE/cygperl5_32.dll。这里它尝试生成一个Parser.dll 文件,但Parser.pm 不是XS 模块,所以这看起来像是ExtUtils::MakeMaker 中的一个错误。明天我将不得不对此进行更多研究。 我明天会试着调查一下。 @Philippe 顺便说一句。你也可以尝试安装Strawberry Perl 它附带XML::Parser 预装 【参考方案1】:

尝试安装libnsl-dev。似乎XML::Parser 使用Devel::CheckLib 来检查是否存在 Expat 的标头和库。它通过创建一个包含#include <expat.h> 语句的小型C 程序来实现此目的,它尝试使用C 编译器编译该语句并添加链接器标志-lexpat。问题是它还添加了来自perl 配置哈希的链接器标志,其中包括-lnsl

$ perl -MConfig -E'say $Configlibs'
-lpthread -lnsl -lgdbm -ldb -ldl -lcrypt -lgdbm_compat

【讨论】:

好的,所以我使用 cygwin setup-x86_64.exe 安装了两个“nsl”库,cygcheck 将它们显示为 ``` libnsl-devel 1.2.0-1 OK libnsl2 1.2.0-1 OK ` `` 安装这些之后,cpanm XML::Parser 现在可以成功了。感谢您的见解。请问您是如何看到上面的perl -Mconfig 行来解决这个问题的? 另外,对于我的教育:谁能告诉我 1. "libnsl-dev" 和 "libnsl_devel" 之间的区别有什么意义吗? 2. 我真的需要安装“libnsl-devel”和“libnsl2”吗?或者只有一个,如果是,是哪个? 3. (1) 和 (2) 的答案会推广到 libexpat* 吗? (还有 libcrypt* 和其他类似案例?)再次感谢。 "谁能告诉我我真的需要安装 libnsl-devel 和 libnsl2" 我认为libnsl-devel 包括libnsl2,所以应该只需要安装libnsl-devel. “你如何看到上面的 perl -Mconfig 行来解决这个问题?” 我查看了源代码,参见 line 373。它将$Configperllibs 添加到链接器标志中。 提示:perl -MConfig -E'say $Configlibs'可以写成perl -V:libs

以上是关于windows7 cygwin perl XML::Parser libexpat*:安装失败的主要内容,如果未能解决你的问题,请参考以下文章

Windows7下采用cygwin编译安装swoole扩展

Windows Terminal + Cygwin 打造win版 iterm2

如何在cygwin中启动X窗口

使用 Cygwin 后无法在 Windows 7 中删除网络驱动器中的文件夹

在windows上配置cygwin时出现这样的错误怎么解决

自己写的browser.bat与perl写的url_handler.pl的比较