源码目录:
解压,\win32目录,
nmake
nmake test
nmake install
1. 使用SDK的头文件,DDK中的cl、link等工具,好处,保证运行库是msvcrt.dll
2. 当然也可以用vs2010不加修改的完成编译,可是用的是MSVCR100。
如果使用gcc编译,可以直接用strawberry即可,遗憾的是activeperl最新三方提供的也是gcc编译,与strawberry基本无异。
==================================================
下面使用方式一进行编译:
比如源码:
http://www.cpan.org/src/5.0/perl-5.18.2.tar.gz
使用方式一的修改点:
(op.c 、toke.c和pad.c有宽字符,用txt另存为ansi编码即可)
win32.c
注释掉:
1.
//~ #if _MSC_VER >= 1400 && defined(_WRITE_ABORT_MSG)
//~ # define SET_INVALID_PARAMETER_HANDLER
//~ #endif
2.
//~ #if !defined __MINGW32__ /* compiler intolerance */
//~ extern int sys_nerr;
//~ #endif
makefile修改
1. setargv 使用一致的宏
$(GLOBEXE) : perlglob$(o)
$(LINK32) $(LINK_FLAGS) $(LIBFILES) -out:$@ -subsystem:$(SUBSYS) \
perlglob$(o) setargv$(o)
改成:
$(GLOBEXE) : perlglob$(o)
$(LINK32) $(LINK_FLAGS) $(LIBFILES) -out:$@ -subsystem:$(SUBSYS) \
perlglob$(o) $(SETARGV_OBJ)
2. 运行库的扩展支持
LIBC = msvcrt.lib
增量一些自定义扩展的
LIBC = msvcrt.lib msvcrtex.lib commonCRT.lib
3. /GS 去掉
!IF "$(WIN64)" == "define" && "$(CCTYPE)" == "SDK2003SP1"
LIBBASEFILES = $(LIBBASEFILES) bufferoverflowU.lib
!ENDIF
替换为:
LIBBASEFILES = $(LIBBASEFILES) bufferoverflow.lib
4.
EXTRACFLAGS = -nologo -GF -W3 -GS-
比如标准msvcrt.dll中没有localtime_s函数,可以写一个commonCRT.lib包含这个函数即可,如下:
#include <stdio.h>
errno_t localtime_s(struct tm* _tm,const time_t *time )
{
_tm=(struct tm *)localtime(time);
return 0;
}
由于ddk中提供的msvcrt.lib不完全包含msvcrt.dll中导出的函数,我们可以自已做一个msvcrtex.lib包含这个函数(使用dumpbin lib工具)。
C:\Users\G-Spider>perl -V
Summary of my perl5 (revision 5 version 18 subversion 2) configuration:
Platform:
osname=MSWin32, osvers=4.0, archname=MSWin32-x86-multi-thread
uname=''
config_args='undef'
hint=recommended, useposi