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
2. nmake学习
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学习的更多相关文章
- windows下搭建学习objective-c 的运行环境【转载】
对于Iphone开发学习者而言,Object -c 是必修的语言.但是由于苹果的自我封闭的产业链发展模式(从芯片.机器.开发语言.终端产品.服务)的限制,要想开发针对苹果iPhone等产品的应用程序, ...
- Live555流媒体服务器编译(Windows下)
最近在回顾之前做过的相关项目,其中包括live555流媒体服务器相关,今天先把live555开源框架在Windows下的编译方法记录一下. live555是一套使用使用开放的标准协议(RTP/RTCP ...
- 使用Codeblock搭建Windows下Objec-c学习环境
学习Object-c如果使用的是Windows,一般推荐使用虚拟机,但是太重量级了,先要下载OS-X,又要下载x-code.这里推荐一种比较简便的方式,使用code-block来搭建简易的Object ...
- windows下makefile命令详解
转自https://blog.csdn.net/xiexievv/article/details/45775005 1. 如果已经有vc6的dsp工程,可直接导出nmake脚本文件(.mak) “Pr ...
- node.js在windows下的学习笔记(3)---npm
1.什么是npm npm是Node.js的包管理器,它允许开发人员在Node.js的应用程序中创建,共享,重用模块.之前我们通过node的官网的安装程序安装了Node.js,那么npm就已经装好了的. ...
- Linux下makefile学习
[make是什么?] make是一个命令工具,是一个解释makefile中指令的命令工具.它可以简化编译过程里面所下达的指令,当执行 make 时,make 会在当前的目录下搜寻 Makefile ( ...
- hadoop-eclipse插件编译及windows下运行wordcount项目
参考文章:http://www.360doc.com/content/16/0227/18/10529016_537828949.shtml, 配置修改:http://blog.csdn.net/lo ...
- Linux下Makefile学习笔记
makefile 可以用于编译和执行多个C/C++源文件和头文件. (1) #include "file.h" 和 #include <file.h> 的区别 #inc ...
- windows下socket学习(一)
关于socket的文章,园子里面有很多,其实无非就是 WSAStartup.socket.bind.listen.accept.recv.send(服务端),WSAStartup.socket.con ...
随机推荐
- thinkphp 常量参考
预定义常量 预定义常量是指系统内置定义好的常量,不会随着环境的变化而变化,包括: URL_COMMON 普通模式 URL (0) URL_PATHINFO PATHINFO URL (1) URL_R ...
- 【Dart学习】-- Dart之泛型
一,概述 Dart是一种可选的类型语言.Dart中的集合默认是异构的.换句话说,单个Dart集合可以托管各种类型的值.但是,可以使Dart集合保持同质值.泛型的概念可以用来实现同样的目的. 泛型的使 ...
- Delphi 判断某个系统服务是否存在及相关状态
记得use WinSvc; //------------------------------------- // 获取某个系统服务的当前状态 // // return status code if s ...
- php编译安装增加pdo扩展
首先查看mysql版本和位置 mysql --version whereis mysql 去php安装目录安装扩展 cd /usr/local/src/php-5.4.25/ext/pdo_mysql ...
- [NOI2016]区间 题解(决策单调性+线段树优化)
4653: [Noi2016]区间 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1593 Solved: 869[Submit][Status][ ...
- ssm+mysql 时间显示相差了12小时的问题 Gson
怎么改时区,连接字符串加时区都无效,后来才发现原来返回的是对的,并不是时区问题. 后来感觉是gson问题,关键是在其他数据表并没有这个问题. 把 gson改成 Gson gson = new Gson ...
- (10)centos7 包管理、远程传文件
一.RPM red package manager 红帽包管理工具 -q 查询 -a 已安装的所有rpm 1.查询已安装的rpm列表 -qa 查看所有的rpm安装包 rpm -qa | grep py ...
- 一道腾讯面试题:如何快速判断某 URL 是否在 20 亿的网址 URL 集合中?布隆过滤器
何为布隆过滤器 还是以上面的例子为例: 判断逻辑: 多次哈希: Guava的BloomFilter 创建BloomFilter 最终还是调用: 使用: 算法特点 使用场景 假设遇到这样一个问题:一个网 ...
- springboot入门级笔记
springboot亮点:不用配置tomcat springboot不支持jsp 准备:配置jdk 配置maven 访问https://start.spring.io/ 并生成自己的springboo ...
- Dubbo入门到精通学习笔记(十四):ActiveMQ集群的安装、配置、高可用测试,ActiveMQ高可用+负载均衡集群的安装、配置、高可用测试
文章目录 ActiveMQ 高可用集群安装.配置.高可用测试( ZooKeeper + LevelDB) ActiveMQ高可用+负载均衡集群的安装.配置.高可用测试 准备 正式开始 ActiveMQ ...