nmake 在构建 Perl 模块时失败



我正在尝试自己构建Win32::D aemon。我不使用 CPAN 的原因是我想更深入地了解 Perl 模块的工作。最后,我希望通过看到它的工作来为另一个问题提出解决方案(在这里并不重要(。

我会看到 3 个构建模块的选项:cygwin、mingw、微软编译器 (cl(

在 MinGW 上,它报告它不受支持(如果在 Makefile.PL 中很简单(,一旦我修改检查以匹配 MinGW,它就会扩展到更多错误在Cygwin上,它抱怨tchar.h,正如我发现的那样,这是一个Windows标头(MinGW确实有它(。

但无论如何,我的真正目标是使用 MS 编译器构建它,所以虽然任何不需要任何特殊库的编译(我想就像 cygwin 一样(会更多。

所以现在这里是我运行 nmake 输出的 name /f Makefile

NMAKE : fatal error U1073: "C:/Program" could not be created.
Stop.

我粗略地翻译了德语的错误消息,但陈述很简单。我在这里看到的似乎是一个路径问题(可能是空格(。我还注意到正斜杠。Makefile是由Makefile.PL脚本创建的(我使用的是Active Perl v5.12.1(:

use strict;
use warnings;
use Config qw(%Config);
use ExtUtils::MakeMaker;
unless ($^O eq "MSWin32" || $^O eq "cygwin") {
    die "OS unsupportedn";
}
require Win32;
my %param = (
    NAME          => 'Win32::Daemon',
    VERSION_FROM  => 'Daemon.pm',
    DEFINE        => '-DPERL_NO_GET_CONTEXT',
    OBJECT        => 'CCallbackList$(OBJ_EXT) CCallbackTimer$(OBJ_EXT) Constant$(OBJ_EXT) CWinStation$(OBJ_EXT) Daemon$(OBJ_EXT) ServiceThread$(OBJ_EXT)',
    XS            => { 'Daemon.xs' => 'Daemon.cpp' },
);
$param{INC} .= ' -EHsc' if $Config{'cc'} =~ /^cl/i;
$param{NO_META} = 1 if eval "$ExtUtils::MakeMaker::VERSION" >= 6.10_03;
WriteMakefile(%param);
sub MY::xs_c {
    '
.xs.cpp:
    $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs >xstmp.c && $(MV) xstmp.c $*.cpp
';
}

我对 MakeMaker 了解不多,但我在这里看不到任何可以修复的东西,并且希望它归结为手动修复Makefile本身。我尝试了几件事,比如引用,但没有任何帮助。

问题是,在Windows上构建时,我已经习惯了这样的问题,但通常这是针对为Unix创建的工具。这个显然只是Windows,所以我希望它开箱即用。所以我认为做错了什么。

关于在哪里找到解决方案的任何帮助?提前谢谢。

编辑/添加:我在另一台带有Active Perl 5.16.x的Win7机器上尝试了这个,它就像一个魅力。我查看了这台机器的不同输出和运行perl Makefile.PL时失败的当前输出,我收到以下输出:

... Detected uninstalled Perl.  Trying to continue.
Unable to find a perl 5 (by these names: C:Program FilesPerl64binperl.exe perl.exe perl5.exe perl5.12.1.exe miniperl.exe, in these dirs: . [...] C:Program FilesPerl64sitebin C:Program FilesPerl64bin [...])
Have progra~1perl64lib
Want tempperl---please-run-the-install-script---lib
Writing Makefile for Win32::Daemon

我截断了输出。现在请有人向我解释:为什么我可以运行perl Makefile.PLperl -v但它在它所在的确切目录中找不到我的 Perl?我重新安装了它,但它不起作用...

好的,

经过数小时的搜索,我似乎终于解决了这个问题。问题在于多个问题。

"卸载的perl"的第一个命令没有任何意义,但是您可以通过提供perl Makefile.PL PERL_SRC="C:Program FilesPerl64"来修复它。警告:这对我来说在命令外壳中不起作用,我不得不使用 powershell ,因为他不会正确处理路径。你可能需要稍微处理一下。注意:最后我通过安装原始的Active Perl来修复它,而不是我的安装程序(公司软件发行版(提供的

那个

现在谈谈找不到perl的问题:这是路径中空格的问题。我(似乎(通过创建一个没有空格的符号链接来解决此问题。现在perl Makefile.PL不会引发任何错误,nmake -f "Makefile"失败了。所以解决方案实际上是:在你的perl路径中不要有空格!这很糟糕,而且在2012年相当坦率,这应该不再是问题,但你来了。

感谢大家付出的所有努力,这是一个很难解决的问题。

最新更新