在一个makefile中输出一个程序的debug版本和release版本
2015-04-30 07:28
253 查看
在一个makefile中输出一个程序的debug版本和release版本
场景:
开发人员(rd)和测试人员(qa)是不同的人,可执行程序是通过配置管理平台提供的。同时,所有程序要上线运行,要通过qa的测试,然后将测试通过的程序,在配置管理平台上输出后上线。(从百度的流程中提取出来的,其他公司的流程未知)
需求:
debug版本的会有一些额外的处理,以及能够打印更多的log;release版本的,需要关闭可能影响性能的一些处理,以及关闭过多的log打印。 rd在送测时,希望,同时送测两个版本的可执行程序,一方面方便qa在需要更详细日志的时候,可以使用debug版本。另一方面,rd不需要单独编译 debug版本给qa使用。
一些知识:
gcc/g++中,有若干参数跟debug有关系,具体的可以看gcc/g++的man页,或者本文后面附录部分。
1、-g参数,在编译中添加一些调试信息,gdb可以使用这些信息。
2、-D参数和-U参数,-D将宏定义传递给程序,-U取消程序中的宏定义。
程序开发:
通过宏定义(比如_DEBUG_)对一些功能或者日志进行开关控制,比如将中间状态存储到文件中,供分析用等。
makefile:
1、makefile中,对一个.o文件只会编译一次,但经测试,同一个c或者cpp文件可以编译为多个不同的.o文件。
2、-g参数和-D、-U参数是在编译成.o文件时生效的。
3、故,对与debug版本和release版本的,可以生成不同的两份.o文件。
4、在link阶段,对debug和release两个版本的程序,使用各自那份的.o文件。
一个例子:
有三个文件,main.cpp, work.cpp, work.h
makefile:
obj1=main.o work.o
obj2=main.debug.o work.debug.o
target1= app
target2= app_for_debug
all: $(target1) $(target2)
clean: rm -f $(obj1) $(obj2) $(target1) $(target2)
%.o : %.cpp
g++ -c $< -o $@
%.debug.o : %.cpp
g++ -D_DEBUG_ -c $< -o $@
$(target1):$(obj1)
g++ -o $(target1) $@ $^
$(target2):$(obj2)
g++ -g -o $(target2) $@ $^
http://blog.sina.com.cn/s/blog_436fe8b10100r8de.html
场景:
开发人员(rd)和测试人员(qa)是不同的人,可执行程序是通过配置管理平台提供的。同时,所有程序要上线运行,要通过qa的测试,然后将测试通过的程序,在配置管理平台上输出后上线。(从百度的流程中提取出来的,其他公司的流程未知)
需求:
debug版本的会有一些额外的处理,以及能够打印更多的log;release版本的,需要关闭可能影响性能的一些处理,以及关闭过多的log打印。 rd在送测时,希望,同时送测两个版本的可执行程序,一方面方便qa在需要更详细日志的时候,可以使用debug版本。另一方面,rd不需要单独编译 debug版本给qa使用。
一些知识:
gcc/g++中,有若干参数跟debug有关系,具体的可以看gcc/g++的man页,或者本文后面附录部分。
1、-g参数,在编译中添加一些调试信息,gdb可以使用这些信息。
2、-D参数和-U参数,-D将宏定义传递给程序,-U取消程序中的宏定义。
程序开发:
通过宏定义(比如_DEBUG_)对一些功能或者日志进行开关控制,比如将中间状态存储到文件中,供分析用等。
makefile:
1、makefile中,对一个.o文件只会编译一次,但经测试,同一个c或者cpp文件可以编译为多个不同的.o文件。
2、-g参数和-D、-U参数是在编译成.o文件时生效的。
3、故,对与debug版本和release版本的,可以生成不同的两份.o文件。
4、在link阶段,对debug和release两个版本的程序,使用各自那份的.o文件。
一个例子:
有三个文件,main.cpp, work.cpp, work.h
makefile:
obj1=main.o work.o
obj2=main.debug.o work.debug.o
target1= app
target2= app_for_debug
all: $(target1) $(target2)
clean: rm -f $(obj1) $(obj2) $(target1) $(target2)
%.o : %.cpp
g++ -c $< -o $@
%.debug.o : %.cpp
g++ -D_DEBUG_ -c $< -o $@
$(target1):$(obj1)
g++ -o $(target1) $@ $^
$(target2):$(obj2)
g++ -g -o $(target2) $@ $^
http://blog.sina.com.cn/s/blog_436fe8b10100r8de.html
相关文章推荐
- 记录一个问题:win32程序release版本和debug版本运行效果不同
- 如何指定让Android的NDK工具编译出Release版本或Debug版本的Native程序
- 使用宏调试 实现 debug release 版本程序
- release版本下生成可执行程序错误调用debug下面的动态连接库
- 在程序里判断编译的是debug还是release版本
- 编译成release版本与debug版本的程序有何执行上的区别?
- GCC 64位程序的makefile条件编译心得——32位版与64位版、debug版与release版(兼容MinGW、TDM-GCC)
- window程序DEBUG和RELEASE 版本差异及调试相关问题
- VC中DEBUG版本可以正常运行的程序有时无法在RELEASE版本下运行
- C++ 程序DEBUG和RELEASE版本的区别
- GCC 64位程序的makefile条件编译心得——32位版与64位版、debug版与release版(兼容MinGW、TDM-GCC)
- VC程序Debug版本和Release版本运行不一致问题
- 编译成release版本与debug版本的程序有何执行上的区别?
- C#.NET常见问题(FAQ)-如何生成release版本的程序,生成debug版本的程序
- 程序的Debug 版本和Release 版本
- window程序DEBUG和RELEASE 版本差异及调试相关问题
- VC 6.0中怎样设置才能生成Debug或Release版本的程序?
- mfc对话框程序在ide编译可运行,但编译完毕的debug和release版本不能运行。。后来发现原因是:用到的sqlite数据库文件没在对应目录下,而代码中没有try..catch..
- 为什么VC中DEBUG版本可以正常运行的程序有时无法在RELEASE版本下正常运行
- cocos2dx: win32程序Release和debug版本:lua:print函数