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



我正在阅读这篇文章。

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

我将文件解压缩到:c:Sourcesperl-5.26.0现在我想构建它。

我设置CCTYPE = MSVC141

现在我运行:

C:ProgramDataMicrosoftWindowsStart MenuProgramsVisual Studio 2017Visual Studio ToolsVCx64 Native Tools Command Prompt for VS 2017

后:

C:Sourcesperl-5.26.0>win32Makefile
'win32Makefile' is not recognized as an internal or external command,
operable program or batch file.
C:Sourcesperl-5.26.0>nmake -f win32Makefile
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:Sourcesperl-5.26.0>

使用CMAKE:

mkdir c:Sourcesperl-5.26.0bld
cd /d c:Sourcesperl-5.26.0bld
cmake . -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX="c:Customperl" -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:Sourcesperl-5.26.0bld>

对不起,我忘了检查是否存在: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...AppDataLocalTempnmFB0B.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 Studio2017CommunityVCToolsMSVC14.10.25017binHostX64x64link.EXE"' : return code '0x460'
Stop.
c:Sourcesperl-5.26.0win32>
win32/Makefile

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

为此:

从"开始"打开
  • "VS 2017 的 x64 本机命令工具命令提示符"命令窗口。

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

  • 设置:

    CCTYPE      = MSVC140
    ...
    CCHOME      = C:Program Files (x86)Microsoft Visual Studio2017CommunityVCToolsMSVC14.10.25017
    CCINCDIR    = $(CCHOME)include
    CCLIBDIR    = $(CCHOME)libx64
    

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

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

  • 然后,nmake testnmake install

请注意,使用 Visual Studio 2015 和 2017 构建的perl最终可能变得相当无用,因为它们与 OpenSSL 无法使用的新平台运行时链接。我认为这意味着您将无法将LWPHTTP::Tiny等模块与https一起使用。我没有对此进行太多调查,所以如果我错了,我希望得到纠正。

请注意,当您安装Visual Studio 2017时,Visual Studio 2013工具也会安装,因此,如果您可以忍受某些错误以及Perl的VS 2013构建配置默认忽略VS 2013中包含的C99功能的事实,或者如果您愿意手动编辑配置文件,我发现使用它进行构建更可靠。

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

最新更新