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应该可以理解了,也可以根据需要进行修改

detours编译与windows下makefile学习的更多相关文章

  1. windows下搭建学习objective-c 的运行环境【转载】

    对于Iphone开发学习者而言,Object -c 是必修的语言.但是由于苹果的自我封闭的产业链发展模式(从芯片.机器.开发语言.终端产品.服务)的限制,要想开发针对苹果iPhone等产品的应用程序, ...

  2. Live555流媒体服务器编译(Windows下)

    最近在回顾之前做过的相关项目,其中包括live555流媒体服务器相关,今天先把live555开源框架在Windows下的编译方法记录一下. live555是一套使用使用开放的标准协议(RTP/RTCP ...

  3. 使用Codeblock搭建Windows下Objec-c学习环境

    学习Object-c如果使用的是Windows,一般推荐使用虚拟机,但是太重量级了,先要下载OS-X,又要下载x-code.这里推荐一种比较简便的方式,使用code-block来搭建简易的Object ...

  4. windows下makefile命令详解

    转自https://blog.csdn.net/xiexievv/article/details/45775005 1. 如果已经有vc6的dsp工程,可直接导出nmake脚本文件(.mak) “Pr ...

  5. node.js在windows下的学习笔记(3)---npm

    1.什么是npm npm是Node.js的包管理器,它允许开发人员在Node.js的应用程序中创建,共享,重用模块.之前我们通过node的官网的安装程序安装了Node.js,那么npm就已经装好了的. ...

  6. Linux下makefile学习

    [make是什么?] make是一个命令工具,是一个解释makefile中指令的命令工具.它可以简化编译过程里面所下达的指令,当执行 make 时,make 会在当前的目录下搜寻 Makefile ( ...

  7. hadoop-eclipse插件编译及windows下运行wordcount项目

    参考文章:http://www.360doc.com/content/16/0227/18/10529016_537828949.shtml, 配置修改:http://blog.csdn.net/lo ...

  8. Linux下Makefile学习笔记

    makefile 可以用于编译和执行多个C/C++源文件和头文件. (1) #include "file.h" 和 #include <file.h> 的区别 #inc ...

  9. windows下socket学习(一)

    关于socket的文章,园子里面有很多,其实无非就是 WSAStartup.socket.bind.listen.accept.recv.send(服务端),WSAStartup.socket.con ...

随机推荐

  1. BulkLoad加载本地文件到HBase表

    BulkLoad加载文件到HBase表 1.功能 将本地数据导入到HBase中 2.原理 BulkLoad会将tsv/csv格式的文件编程hfile文件,然后再进行数据的导入,这样可以避免大量数据导入 ...

  2. BZOJ 1927: [Sdoi2010]星际竞速(费用流)

    传送门 解题思路 仿照最小路径覆盖问题,用费用流解决此题.最小路径覆盖问题是拆点连边后用\(n-\)最大匹配,这里的话也是将每个点拆点,源点向入点连流量为\(1\),费用为\(0\)的边,向出点连流量 ...

  3. [NOIP模拟测试10]辣鸡(ljh) 题解

    首先计算块内贡献,很显然是$(x_2-x_1)*(y_2-y_1)*2$. 然后考虑矩形之间的贡献,sort一遍分类讨论$n^2$暴力即可. 注意考虑边界情况是否能多两个,以及角对角的情况. 另外,排 ...

  4. 剑指offer——二进制中1的个数(c++)

    题目描述实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如,把9表示成二进制是1001,则输出为2 常规解法首先把n和1做位运算,判断n的最低位是不是1,然后把1左移一位得到2,再把n和2 ...

  5. (转)Openfire 中SASL的认证方式之:PLAIN,DIGEST-MD5,anonymous

    转:http://blog.csdn.net/coding_me/article/details/39524137 SASL  的认证方式包括:     1. PLAIN:plain是最简单的机制,但 ...

  6. 虚拟机安装(Cent OS)

    转载:http://www.cnblogs.com/kkdd-2013/p/3973807.html 0 前言 本篇主要介绍在虚拟机VMware上安装CentOS6.5的过程,并且在自己电脑上安装成功 ...

  7. 使用wordpress搭建的网站如何去掉域名中的wordpess

    我们搭建好的网站当以文件夹的形式把wordpress程序放在空间的根目录时,访问的时候要加上文件夹名,访问地址就是:http://www.xxx.com/wordpress,直接用域名是无法访问,解决 ...

  8. 浅谈HP-Socket在物联网的应用

    原文链接:https://my.oschina.net/chrisforbt/blog/1669746 一.应用背景 去年公司成立了个项目——<智慧用电安全隐患监管服务平台>,计划是开发一 ...

  9. 5. Jmeter常用快捷键

    快捷键 功能 备注 Ctrl + C 复制 可复制组件 Ctrl + V 粘贴 可粘贴组件 Ctrl + Shift + C 复制粘贴当前组件到下一行   Ctrl + R 运行测试计划   Ctrl ...

  10. HDU 6685 Rikka with Coin (枚举 思维)

    2019 杭电多校 9 1006 题目链接:HDU 6685 比赛链接:2019 Multi-University Training Contest 9 Problem Description Rik ...