nmake无法构建Perl模块

时间:2012-05-22 10:57:10

标签: windows perl perl-module nmake

我正在尝试自己构建Win32::Daemon。我不使用CPAN的原因是因为我想深入研究Perl模块的工作。最后,我希望通过看到这个问题来解决另一个问题(这里不重要)。

我会看到构建模块的3个选项:cygwin,mingw,microsoft compiler(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 unsupported\n";
}

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 Files\Perl64\bin\perl.exe perl.exe perl5.exe perl5.12.1.exe miniperl.exe, in these dirs: . [...] C:\Program Files\Perl64\site\bin C:\Program Files\Perl64\bin [...])
Have \progra~1\perl64\lib
Want \temp\perl---please-run-the-install-script---\lib
Writing Makefile for Win32::Daemon

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

1 个答案:

答案 0 :(得分:1)

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

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

现在问题是没有找到perl:这是路径中空格的问题。我通过创建一个没有空格的符号链接修复了这个(貌似)。现在perl Makefile.PL不会出现任何错误, nmake -f "Makefile"失败。所以解决方案真的是:你的perl-path中没有空格!这很糟糕,而且在2012年非常坦率,这不应该是一个问题,只是在这里你去。

感谢大家投入的所有努力,这是一个难以解决的问题。