【问题标题】:nmake fails on building Perl modulenmake 在构建 Perl 模块时失败
【发布时间】:2012-05-28 20:41:32
【问题描述】:

我正在尝试自己构建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?我重新安装了它,但它没有工作...

【问题讨论】:

  • 你使用的是哪个 Perl 发行版?
  • 你能在Makefile中找到C:/Program的出现吗? (我想这实际上是C:/Program Files)。知道它的来源可能会给您提供其他可以跟踪的信息。
  • 在转义 Makefile 中使用的字符串时可能会出现问题,您可能需要使用 Makefile.PL 生成 makefile,然后对其进行编辑以正确转义字符串。 nmake 和 dmake 对 Makefile 的解释不同,因此 MakeMaker 很难做到这一点。
  • 我正在使用 Active Perl v5.12.1。路径在makefile中,是的。那么我该如何逃避呢?为什么它有正斜杠?
  • 您似乎因为错误的假设而将自己逼入绝境,我们必须后退几步,而不仅仅是纠正症状。您是否手动安装了编译器工具链?如果是,您使用了谁的说明?如果没有,请通过安装 MinGWdmake PPM 确认您已获得工具链。

标签: windows perl perl-module nmake


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-10-26
    • 2021-04-27
    • 2019-12-26
    • 2019-11-06
    • 2017-10-29
    • 2016-04-29
    • 2019-03-06
    • 2019-12-15
    • 2018-11-27
    相关资源
    最近更新 更多