使用 Visual Studio 2017 从 Windows 10 的源代码构建 Perl
Build Perl from Source for Windows 10 using Visual Studio 2017
我正在读这个 post。
http://www.cpan.org/src/README.html
和
http://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 Studio17\Community\VC\Tools\MSVC.10.25017\bin\HostX64\x64\link.EXE"' : return code '0x460'
Stop.
c:\Sources\perl-5.26.0\win32>
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" 命令 window。
转到您提取 Perl 5.26.0 源代码的目录,然后编辑 win32/Makefile
:
设置:
CCTYPE = MSVC140
...
CCHOME = C:\Program Files (x86)\Microsoft Visual Studio17\Community\VC\Tools\MSVC.10.25017
CCINCDIR = $(CCHOME)\include
CCLIBDIR = $(CCHOME)\lib\x64
注意 CCHOME
中的版本相关目录。请确保您使用的版本与您所拥有的相对应。
运行 nmake
<perl source directory>\win32
。现在,我通常会进行更多更改,但这是进行构建所需的最少更改量。
然后,nmake test
,nmake install
。
请注意,使用 Visual Studio 2015 和 2017 构建的 perl
可能最终会变得毫无用处,因为它们 link 与 OpenSSL 无法使用的新平台运行时一起使用。我认为这意味着您将无法将 LWP
、HTTP::Tiny
等模块与 https
一起使用。我没有对此进行太多调查,所以如果我错了,我很乐意得到纠正。
请注意,当您安装 Visual Studio 2017 时,也会安装 Visual Studio 2013 工具,因此如果您可以接受某些 bugs 以及 Perl 的 VS 2013 构建配置这一事实默认忽略 VS 2013 中包含的 C99 功能,或者如果您愿意手动编辑配置文件,我发现使用它构建更可靠。
一般来说,您最好使用 Strawberry Perl。如果您想使用依赖于 C 库的模块,使用 MinGW 工具链可以节省大量时间。
我正在读这个 post。
http://www.cpan.org/src/README.html 和 http://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 Studio17\Community\VC\Tools\MSVC.10.25017\bin\HostX64\x64\link.EXE"' : return code '0x460'
Stop.
c:\Sources\perl-5.26.0\win32>
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" 命令 window。
转到您提取 Perl 5.26.0 源代码的目录,然后编辑
win32/Makefile
:设置:
CCTYPE = MSVC140 ... CCHOME = C:\Program Files (x86)\Microsoft Visual Studio17\Community\VC\Tools\MSVC.10.25017 CCINCDIR = $(CCHOME)\include CCLIBDIR = $(CCHOME)\lib\x64
注意
CCHOME
中的版本相关目录。请确保您使用的版本与您所拥有的相对应。运行
nmake
<perl source directory>\win32
。现在,我通常会进行更多更改,但这是进行构建所需的最少更改量。然后,
nmake test
,nmake install
。
请注意,使用 Visual Studio 2015 和 2017 构建的 perl
可能最终会变得毫无用处,因为它们 link 与 OpenSSL 无法使用的新平台运行时一起使用。我认为这意味着您将无法将 LWP
、HTTP::Tiny
等模块与 https
一起使用。我没有对此进行太多调查,所以如果我错了,我很乐意得到纠正。
请注意,当您安装 Visual Studio 2017 时,也会安装 Visual Studio 2013 工具,因此如果您可以接受某些 bugs 以及 Perl 的 VS 2013 构建配置这一事实默认忽略 VS 2013 中包含的 C99 功能,或者如果您愿意手动编辑配置文件,我发现使用它构建更可靠。
一般来说,您最好使用 Strawberry Perl。如果您想使用依赖于 C 库的模块,使用 MinGW 工具链可以节省大量时间。