编译好的,已上传:http://download.csdn.net/detail/haoyujie/7234111
perl5.16建立vc6.dsp之后编译通过,一定看下面的说明
最近又开始重新开始C++项目。
任务已规划好,第一件具体工作,就是编译 perl.
当然,这个工作也不是必要的。因为perl是一个非常古老和成熟的项目。里面自带的makefile是可以直接用MSVC编译过了,反倒是网上所说的使用dmake的方法,是编译不过的。
有两种方法,可以编译,第一种方法是,用VC6建一个基于makefile的工程,然后,用perl 的makefile的内容替换工程里的makefile的内容。
这个方法我不多说了。微软的visual studio,自从升级到.net,被阿三接手之后,就丢失了许多功能,这个基于makefile建立C++项目,就是被丢失的重要功能之一。据说,从Visual 2010开始,这个功能终于回归了。但我没有去试验。还是用VC6吧,做出来的工程,易于发布。而且VC6里面,快捷键是最全的。
比如说吧,从进入visual studio 2002开始,我就没有找到只编译当前.c或.cpp文件的功能,而在VC6里,按下Ctrl+F7就可以了。微软这十几年,一直在倒退。
好了,本文的标题,重点是说,分析MAKEFILE.
所以,进入正题:如何分析MAKEFILE,并且将之转换成为真正的VC++工程。
建立一个VC工程,第一步分析是DLL还是EXE
第二步是compiler
第三步是link.
我们打开perl 的makefile后,
不禁有些茫然,好长的一个文件。
所以,分析makefile要找到开头。
这里我随意找个开始的地方:
在后面找到这样一段。
$(PERLEXE): $(PERLDLL) $(CONFIGPM) $(PERLEXE_OBJ) $(PERLEXE_RES)
$(LINK32) -subsystem:console -out:$@ $(LINK_FLAGS) \
$(LIBFILES) $(PERLEXE_OBJ) $(SETARGV_OBJ) $(PERLIMPLIB) $(PERLEXE_RES)
$(EMBED_EXE_MANI)
copy $(PERLEXE) $(WPERLEXE)
$(MINIPERL) -I..\lib bin\exetype.pl $(WPERLEXE) WINDOWS
单纯从字面,也能看出一些门道:
$(PERLEXE) -- 代表着我们的compiler和link的输出。
这个输出,由:$(PERLDLL) $(CONFIGPM) $(PERLEXE_OBJ) $(PERLEXE_RES) 这四个是间目标文件组成。
然后用 $(LINK32) -subsystem:console -out:$@ $(LINK_FLAGS) 链接成为可执行文件。
拷贝到指定位置 copy $(PERLEXE) $(WPERLEXE)
转换可执行文件的类型: $(MINIPERL) -I..\lib bin\exetype.pl $(WPERLEXE) WINDOWS ,这句话是我跑到网上找到的,意图是把上面link出来的cosole可执行文件的类型,转换成为windows类型。
http://search.cpan.org/~dapm/perl-5.10.1/win32/bin/exetype.pl
exetype - Change executable subsystem type between "Console" and "Windows"
SYNOPSIS
C:\perl\bin> copy perl.exe guiperl.exe C:\perl\bin> exetype guiperl.exe windows
----------------------------------------------------
好,现在,无论如何,我们找到了一个开端。
再回头分析这句话,
$(PERLEXE): $(PERLDLL) $(CONFIGPM) $(PERLEXE_OBJ) $(PERLEXE_RES)
里面有个:$(PERLDLL)
我们到编译出的结果(前面用makefile方式编出来的),去看看:在C:\perl\bin
果然有几个DLL,其中一个就是perl516.dll
用depends打开,果然这个库就是perl的核心。
也就是我们本次任务的核心。
makefile一般而言,是非常复杂,它与visual strudio的工程文件的思想,是完全不同的,makefile的目标就是毕其功于一役,make完了,什么都完事了。一个makefile,里面会执行几个到上百个任务。
而我们,在分析makefile里,时刻不要迷失方向,忘记目的,用我的话说,抓住要害,一击结束。
好,这个dll是关键,所以,我们立即转向。
---------------
这里给出个小提示,分析makefile还有一个捷径,就是找clean段,这里面会详细描述它要删除哪些东西,往往会给你许多重要的信息。
---------
我们来到makefile头部,查找:PERLDLL,找到:
PERLDLL = ..\perl516.dll
这个文件名,与我们现在看到的输出,是一样的。
这一段里还有好多东西:
# makedef.pl must be updated if this changes, and this should normally
# only change when there is an incompatible revision of the public API.
PERLIMPLIB = ..\perl516.lib
PERLSTATICLIB = ..\perl516s.lib
PERLDLL = ..\perl516.dll
MINIPERL = ..\miniperl.exe
MINIDIR = .\mini
PERLEXE = ..\perl.exe
WPERLEXE = ..\wperl.exe
PERLEXESTATIC = ..\perl-static.exe
GLOBEXE = ..\perlglob.exe
CONFIGPM = ..\lib\Config.pm ..\lib\Config_heavy.pl
MINIMOD = ..\lib\ExtUtils\Miniperl.pm
X2P = ..\x2p\a2p.exe
GENUUDMAP = ..\generate_uudmap.exe
!IF "$(BUILD_STATIC)" == "define"
我们暂不关心。
往前找:
$(PERLDLL): perldll.def $(PERLDLL_OBJ) $(PERLDLL_RES) Extensions_static
$(LINK32) -dll -def:perldll.def -base:0x28000000 -out:$@ @Extensions_static @<<
$(LINK_FLAGS) $(DELAYLOAD) $(LIBFILES) $(PERLDLL_OBJ) $(PERLDLL_RES)
分析一下:perldll.def制作pef,函数导出列表文件,这个也不是我们关心的。因为这个是不必要的。以前做过TCL语言的导出,除非使用stub方式,否则用不着这个。
perldll.def : $(MINIPERL) $(CONFIGPM) ..\embed.fnc ..\makedef.pl create_perllibst_h.pl
$(MINIPERL) -I..\lib create_perllibst_h.pl
$(MINIPERL) -I..\lib -w ..\makedef.pl PLATFORM=win32 $(OPTIMIZE) $(DEFINES) $(BUILDOPT) \
CCTYPE=$(CCTYPE) TARG_DIR=..\ > perldll.def
PERLDLL_OBJ
这就是我们苦苦寻找的宝藏了!!!!!!!!!!!!!!!
为什么呢,因为我们锁定了我们要编译的DLL,之后,就是要找出哪些源文件编译这个DLL,以及编译里用到了哪些预编译宏。
好了,开始吧。
PERLDLL_OBJ = $(CORE_OBJ)
找到
CORE_OBJ = $(MICROCORE_OBJ) $(EXTRACORE_SRC:.c=.obj)
再找
MICROCORE_OBJ = $(MICROCORE_SRC:.c=.obj)
再找
MICROCORE_SRC = \
..\av.c \
..\deb.c \
..\doio.c \
..\doop.c \
..\dump.c \
..\globals.c \
..\gv.c \
..\mro.c \
..\hv.c \
..\locale.c \
..\keywords.c \
..\mathoms.c \
..\mg.c \
..\numeric.c \
..\op.c \
..\pad.c \
..\perl.c \
..\perlapi.c \
..\perly.c \
..\pp.c \
..\pp_ctl.c \
..\pp_hot.c \
..\pp_pack.c \
..\pp_sort.c \
..\pp_sys.c \
..\reentr.c \
..\regcomp.c \
..\regexec.c \
..\run.c \
..\scope.c \
..\sv.c \
..\taint.c \
..\toke.c \
..\universal.c \
..\utf8.c \
..\util.c
好了,以我的习惯,到这就可以开始了。没必要再分析下去了。
用VC6建一个DLL工程,然后开始编译。
有几个宏要设置:PERL_CORE,PERL_MAD,PERLDLL
引入这个库,还有一些源文件,也要引入。
这里我就不多说了。只要意思明确,要完成就不难了。
不过,要求你对VC的掌握程度,因为出错时,你要信心十足知道怎么解决。
编译好的,已上传:http://download.csdn.net/detail/haoyujie/7234111
perl5.16建立vc6.dsp之后编译通过,一定看下面的说明