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*:安装失败的主要内容,如果未能解决你的问题,请参考以下文章
Windows Terminal + Cygwin 打造win版 iterm2