使用VC编译perl-5.16.2,如何分析makefile

编译好的,已上传: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之后编译通过,一定看下面的说明


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值