detours编译与windows下makefile学习

1.编译

windows环境命令行编译很少用,detours需要使用命令行编译,刚好试试,过程如下:

1.为了能够在所有目录中使用nmake命令,需要设置环境变量Path D:\Program Files\Microsoft Visual Studio 9.0\VC\bin

2.运行这个文件:D:\Program Files\Microsoft Visual Studio 9.0\VC\bin\vcvars32.bat,将其拖到命令行界面中回车即可,这个批处理用来设置一些变量,主要是vc编译用到的库

3.进入detours目录D:\detours\Detours3.0,nmake回车即可

4.编译samples出错,只需要把

samples\common.mak中的

.rc{$(OBJD)}.res:

    rc /nologo /DDETOURS_BITS=$(DETOURS_BITS) /fo$(@) /i$(INCD) $(*B).rc

中的/nologo删掉即可

2. nmake学习

下面列出了detours中所有用到的makefile和相应的配置文件的注释

Detours3.0\Makefile

# 井开头是注释

# 定义ROOT为当前文件夹
ROOT = .

#生成文件预处理指令,表示将Detours3.0\system.mak包含进来,

#""括起来表示不在系统目录中查找,<>括起来则表示可能到INCLUDE环境变量指示的路径中查找
!include "$(ROOT)\system.mak"

#伪目标,标记为当前时间,即总是最新的
all:

# MAKEDIR为递归调用nmake所用的一个宏,表示调用nmake时的当前目录
    cd "$(MAKEDIR)\src"

# MAKE为递归调用nmake所用的一个宏,表示nmake的完整路径

#/NOLOGO 表示不显示nmake版本信息

#MAKEFLAGS 当前有效的选项,不包含/F

# /F filename 制定makefile名字,默认为makefile

    @$(MAKE) /NOLOGO /$(MAKEFLAGS)
    cd "$(MAKEDIR)\samples"
    @$(MAKE) /NOLOGO /$(MAKEFLAGS)
@if exist "$(MAKEDIR)\bugs\makefile" cd "$(MAKEDIR)\bugs" && $(MAKE) /NOLOGO /$(MAKEFLAGS)
    cd "$(MAKEDIR)"

clean:
    cd "$(MAKEDIR)\src"

#执行相应目录中的clean伪目标
    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean
    cd "$(MAKEDIR)\samples"
    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean
@if exist "$(MAKEDIR)\bugs\makefile" cd "$(MAKEDIR)\bugs" && $(MAKE) /NOLOGO /$(MAKEFLAGS) clean
    cd "$(MAKEDIR)"

realclean: clean
    cd "$(MAKEDIR)\src"

#执行相应目录中的realclean伪目标
    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean
    cd "$(MAKEDIR)\samples"
    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean
@if exist "$(MAKEDIR)\bugs\makefile" cd "$(MAKEDIR)\bugs" && $(MAKE) /NOLOGO /$(MAKEFLAGS) realclean
    cd "$(MAKEDIR)"

# /q /s删除文件不需要确定

# 2>nul 不提示删除错误信息
    -rmdir /q /s $(INCDS) 2> nul
    -rmdir /q /s $(LIBDS) 2> nul
    -rmdir /q /s $(BINDS) 2> nul
    -rmdir /q /s dist 2> nul
    -del docsrc\detours.chm 2> nul
    -del /q *.msi 2>nul

test:
    cd "$(MAKEDIR)\samples"
    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test
    cd "$(MAKEDIR)"

Detours3.0\system.mak

这个文件主要定义一些宏,对于X86系统,定义如下

#通过环境变量PROCESSOR_ARCHITECTURE来获取

DETOURS_TARGET_PROCESSOR = X86

DETOURS_32BIT=1
DETOURS_BITS=32
DETOURS_OPTION_BITS=64

INCD = $(ROOT)\include
LIBD = $(ROOT)\lib.$(DETOURS_TARGET_PROCESSOR)
BIND = $(ROOT)\bin.$(DETOURS_TARGET_PROCESSOR)
OBJD = obj.$(DETOURS_TARGET_PROCESSOR)

INCDS = $(ROOT)\include
LIBDS = $(ROOT)\lib.x86 $(ROOT)\lib.x64 $(ROOT)\lib.ia64 $(ROOT)\lib.arm
BINDS = $(ROOT)\bin.x86 $(ROOT)\bin.x64 $(ROOT)\bin.ia64 $(ROOT)\bin.arm
OBJDS = obj.x86 obj.x64 obj.ia64 obj.arm

Detours3.0\src\Makefile

同Detours3.0\Makefile中的部分不解释

CFLAGS=/W4 /WX /Zi /MTd /Gy /Gm- /Zl /Od /DDETOURS_BITS=$(DETOURS_BITS)
!IF $(DETOURS_SOURCE_BROWSING)==1
CFLAGS=$(CFLAGS) /FR
!ELSE
CFLAGS=$(CFLAGS) /DWIN32_LEAN_AND_MEAN /D_WIN32_WINNT=0x403
!ENDIF


LIBFLAGS=/nologo
LINKFLAGS=/release


OBJS = \
    $(OBJD)\detours.obj     \
    $(OBJD)\modules.obj     \
    $(OBJD)\disasm.obj      \
    $(OBJD)\image.obj       \
    $(OBJD)\creatwth.obj    \


#列出推理规则匹配的扩展名
.SUFFIXES: .cpp .h .obj
#预定义.cpp生成.obj的推理规则
# &(CC) 为cl.exe
# /Fd 命名pdb文件
# /Fo 命名对象文件
# /c 只编译不链接
.cpp{$(OBJD)}.obj:
    $(CC) $(CFLAGS) /Fd$(LIBD)\detours.pdb /Fo$@ /c .\$(*B).cpp


#伪目标
all: dirs \
    $(LIBD)\detours.lib \
    $(INCD)\detours.h   \
    $(INCD)\detver.h    \


#伪目标,创建响应目录
dirs:
    @if not exist "$(INCD)" mkdir "$(INCD)" && echo.   Created $(INCD)
    @if not exist "$(LIBD)" mkdir "$(LIBD)" && echo.   Created $(LIBD)
    @if not exist "$(BIND)" mkdir "$(BIND)" && echo.   Created $(BIND)
    @if not exist "$(OBJD)" mkdir "$(OBJD)" && echo.   Created $(OBJD)
#调用lib命令生成库
$(LIBD)\detours.lib : $(OBJS)
    lib $(LIBFLAGS) /out:$@ $(OBJS)
#复制文件到目标文件夹
$(INCD)\detours.h : detours.h
    copy detours.h $@
#复制文件到目标文件夹
$(INCD)\detver.h : detver.h
    copy detver.h $@

#根据代码生成.obj
$(OBJD)\detours.obj : detours.cpp detours.h
$(OBJD)\modules.obj : modules.cpp detours.h
$(OBJD)\disasm.obj : disasm.cpp detours.h
$(OBJD)\image.obj : image.cpp detours.h
$(OBJD)\creatwth.obj : creatwth.cpp uimports.cpp detours.h

samples\common.mak

与之前介绍的类似,只是增加了变异资源的生成规则

CLIB=/MT
AFLAGS=/nologo /Zi /c /Fl
CFLAGS=/nologo /Zi $(CLIB) /Gm- /W4 /WX /Od /DDETOURS_BITS=$(DETOURS_BITS)

LIBFLAGS=/nologo
LINKFLAGS=/release /incremental:no

ASM=ml
AFLAGS=$(AFLAGS) /DDETOURS_X86=1
CFLAGS=$(CFLAGS) /Gs /DDETOURS_X86=1 /DDETOURS_32BIT=1 /D_X86_
LIBFLAGS=$(LIBFLAGS) /machine:x86
DLLENTRY=_DllMainCRTStartup@12
LINKFLAGS=$(LINKFLAGS) /machine:x86

CFLAGS=$(CFLAGS) /DDETOURS_OPTION_BITS=$(DETOURS_OPTION_BITS)

LIBS = $(LIBD)\syelog.lib $(LIBD)\detours.lib \
        kernel32.lib gdi32.lib user32.lib shell32.lib
DEPS = $(LIBD)\syelog.lib $(LIBD)\detours.lib

.SUFFIXES: .cpp .h .obj .rc .res


.cpp{$(OBJD)}.obj:
    $(CC) /nologo $(CFLAGS) /Fd$(OBJD)\vc.pdb /Fo$@ /c $(*B).cpp

.rc{$(OBJD)}.res:
    rc /DDETOURS_BITS=$(DETOURS_BITS) /fo$(@) /i$(INCD) $(*B).rc

其它

如果看了上面内容,例子中其它makefile应该可以理解了,也可以根据需要进行修改

posted @ 2014-10-22 15:51  vcerror  阅读(798)  评论(0编辑  收藏  举报