使用 Visual Studio 2017 从源代码构建适用于 Windows 10 的 Perl

问题描述 投票:0回答:2

我正在读这篇文章。

http://www.cpan.org/src/README.htmlhttp://search.cpan.org/~rjbs/perl-5.16.0/README.win32#Building

我将文件提取到:

c:\Sources\perl-5.26.0\
现在我想构建它。

我设置了

CCTYPE       = MSVC141

现在我跑步:

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2017\Visual Studio Tools\VC\x64 Native Tools Command Prompt for VS 2017

后来:

    C:\Sources\perl-5.26.0>win32\Makefile
    'win32\Makefile' is not recognized as an internal or external command,
    operable program or batch file.

    C:\Sources\perl-5.26.0>nmake -f win32\Makefile

    Microsoft (R) Program Maintenance Utility Version 14.10.25019.0
    Copyright (C) Microsoft Corporation.  All rights reserved.

    NMAKE : fatal error U1073: don't know how to make 'config_H.vc'
    Stop.

    C:\Sources\perl-5.26.0>

使用 CMAKE:

mkdir c:\Sources\perl-5.26.0\bld
cd /d c:\Sources\perl-5.26.0\bld

cmake . -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX="c:\Custom\perl" -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo  
CMake Error: The source directory "C:/Sources/perl-5.26.0/bld" does not appear to contain CMakeLists.txt.
Specify --help for usage, or press the help button on the CMake GUI.

c:\Sources\perl-5.26.0\bld>

抱歉,我忘记检查是否存在:

CMakeLists.txt
文件

是否可以构建 perl 而不是从 ActivePerl 下载(安装程序无法正常工作) Strawberry-perl(网站已关闭)

请告诉我。

我必须如何定义这个变量:

MSVCDIR     = ???
CCHOME      = $(MSVCDIR)
CCINCDIR    = $(CCHOME)\include
CCLIBDIR    = $(CCHOME)\lib

我的输出。

generate_uudmap.c
        link -out:..\generate_uudmap.exe @C:\Users\...\AppData\Local\Temp\nmFB0B.tmp
generate_uudmap.obj : error LNK2001: unresolved external symbol __imp_exit
generate_uudmap.obj : error LNK2001: unresolved external symbol __imp_fputc
generate_uudmap.obj : error LNK2001: unresolved external symbol __imp_fopen
generate_uudmap.obj : error LNK2001: unresolved external symbol __imp___acrt_iob_func
generate_uudmap.obj : error LNK2001: unresolved external symbol __imp_fclose
generate_uudmap.obj : error LNK2001: unresolved external symbol __imp___stdio_common_vfprintf
generate_uudmap.obj : error LNK2001: unresolved external symbol __imp__errno
generate_uudmap.obj : error LNK2001: unresolved external symbol __imp_fputs
generate_uudmap.obj : error LNK2001: unresolved external symbol __imp_strerror
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol _seh_filter_exe
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol _set_app_type
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol __setusermatherr
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol _configure_narrow_argv
msvcrt.lib(utility.obj) : error LNK2001: unresolved external symbol _configure_narrow_argv
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol _initialize_narrow_environment
msvcrt.lib(utility.obj) : error LNK2001: unresolved external symbol _initialize_narrow_environment
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol _get_initial_narrow_environment
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol _initterm
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol _initterm_e
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol exit
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol _exit
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol _set_fmode
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol __p___argc
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol __p___argv
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol _cexit
msvcrt.lib(utility.obj) : error LNK2001: unresolved external symbol _cexit
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol _c_exit
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol _register_thread_local_exe_atexit_callback
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol _configthreadlocale
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol _set_new_mode
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol __p__commode
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol __C_specific_handler
msvcrt.lib(utility.obj) : error LNK2001: unresolved external symbol __C_specific_handler
msvcrt.lib(utility.obj) : error LNK2001: unresolved external symbol _seh_filter_dll
msvcrt.lib(utility.obj) : error LNK2001: unresolved external symbol _initialize_onexit_table
msvcrt.lib(utility.obj) : error LNK2001: unresolved external symbol _register_onexit_function
msvcrt.lib(utility.obj) : error LNK2001: unresolved external symbol _execute_onexit_table
msvcrt.lib(utility.obj) : error LNK2001: unresolved external symbol _crt_atexit
msvcrt.lib(utility.obj) : error LNK2001: unresolved external symbol _crt_at_quick_exit
msvcrt.lib(tncleanup.obj) : error LNK2001: unresolved external symbol __std_type_info_destroy_list
msvcrt.lib(utility_desktop.obj) : error LNK2001: unresolved external symbol terminate
msvcrt.lib(utility_desktop.obj) : error LNK2001: unresolved external symbol memset
..\generate_uudmap.exe : fatal error LNK1120: 38 unresolved externals
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX64\x64\link.EXE"' : return code '0x460'
Stop.

c:\Sources\perl-5.26.0\win32>
visual-studio perl cmake nmake
2个回答
1
投票

win32/Makefile
并不正式支持使用 Visual Studio 2017 进行构建。但是,它确实支持使用 VS 2015 进行构建。使用 Visual Studio 2015 工具构建与使用 Visual Studio 2013 工具构建相比需要单独的配置的原因是Visual Studio 2017 工具也是如此,因此您可以使用相同的配置。

为此:

  • 从“开始”打开“x64 Native Command Tools Command Prompt for VS 2017”命令窗口。

  • 转到提取 Perl 5.26.0 源代码的目录,然后编辑

    win32/Makefile
    :

  • 设置:

    CCTYPE      = MSVC140
    
    ...
    CCHOME      = C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017
    CCINCDIR    = $(CCHOME)\include
    CCLIBDIR    = $(CCHOME)\lib\x64
    

    注意

    CCHOME
    中的版本相关目录。确保您使用的版本与您所拥有的版本相对应。

  • nmake
    中运行
    <perl source directory>\win32
    。现在,我通常会进行更多更改,但这是构建所需的最小更改量。

  • 然后,

    nmake test
    nmake install

请注意,使用 Visual Studio 2015 和 2017 构建的

perl
最终可能会毫无用处,因为它们与 OpenSSL 无法使用的新平台运行时链接。我认为这意味着您将无法将
LWP
HTTP::Tiny
等模块与
https
一起使用。我对此没有进行太多研究,所以如果我错了,我很乐意纠正。

请注意,当您安装 Visual Studio 2017 时,也会安装 Visual Studio 2013 工具,因此,如果您可以忍受某些bug,并且默认情况下 VS 2013 的 Perl 构建配置会忽略 VS 2013 中包含的 C99 功能,或者如果你愿意手动编辑配置文件,我发现用它来构建更可靠。

一般来说,你最好使用 Strawberry Perl。如果您想使用依赖于 C 库的模块,使用 MinGW 工具链可以节省大量时间。


0
投票

也许自提出问题以来(七年前)情况发生了变化。现在,可以使用 VisualC++ Community Edition(2015/2017/2019/2022 中的任何版本)从源代码构建 Perl。
正如第一个答案中详细描述的那样,建筑非常标准。但无论如何,很快,无论什么版本,我的是5.40.0

  1. 编辑此文件
    pathToPerl\perl-5.40.0\win32\Makefile
    ,并选择MSVC版本
#
# uncomment exactly one of the following
#
# Visual C++ 2015 (aka Visual C++ 14.0) (full version or Express Edition)
#CCTYPE     = MSVC140
# Visual C++ 2017 (aka Visual C++ 14.1) (full version or Community Edition)
#CCTYPE     = MSVC141
# Visual C++ 2019 (aka Visual C++ 14.2) (full version or Community Edition)
#CCTYPE     = MSVC142
# Visual C++ 2022 (aka Visual C++ 14.3) (full version or Community Edition)
CCTYPE      = MSVC143
  1. 打开
    x64 Native Command Tools Command Prompt for VS ***
    任何与您的SDK相对应的内容,然后进入perl源文件夹并编译
cd /D pathToPerl\perl-5.40.0\Win32
nmake

仅此而已。
然后根据需要完成测试和安装步骤,这些步骤不属于本问题的范围,并在 Readme 和 Readme.win32 文件中进行了描述。

© www.soinside.com 2019 - 2024. All rights reserved.