#include <stdio.h>
#define DEBUG
#ifdef DEBUG
#define STDOUT_beta printf
#define STDOUT_rtm //
#else
#define STDOUT_beta //
#define STDOUT_rtm printf
#endif // DEBUG
int main(void)
{
STDOUT_bate("This is Visual Studio 2013 Beta!\n");
STDOUT_rtm("This is Visual Studio 2013 RTM!\n");
return 0;
}
第2种方式,修改编译环境,具体方法如下:
选择项目-右键属性-配置属性-C/C++-预处理器 (注意编译器里面的默认_DEBUG 前面有个下划杠)
在预处理器定义的那一行添加你的宏定义。
比如:DEBUD;
点击确定,这样上述代码的第2行#define DEBUG就会由编译器自动添加了,将第2行注释掉,重新编译,运行结果如下:
对比1、2两种实现方式,往往在实际项目中,模块与模块之间的衔接比较复杂,我们不可能再每一个文件前面写入或者删除相应的宏,所以比较流行的做法是使用第2种方式。
visual studio的条件编译就是这样,如果你使用过gcc/g++,你可以更加透彻的看到条件编译的实现机制。
原文:https://www.cnblogs.com/ligelaige/p/3379550.html
Makefile条件编译debug版和release版
https://blog.csdn.net/wojiuguowei/article/details/82351792
一般,在开发测试阶段用debug版本,而上线发布用release版本。
使用Makefile定制编译不同版本,避免修改程序和Makefile文件,将会十分方便。
读了一些资料,找到一个解决方法,Makefile预定义宏与条件判断,结合make预定义变量,进行条件编译。
比如,有一个test.cpp,包含这段代码
#ifdef debug
//your code
#endif
你希望在debug版本要执行它,在release版本不执行。
我们可以写这样的一个Makefile:
ver = debug
ifeq ($(ver), debug)
ALL: test_d
CXXFLAGS = -c -g -Ddebug
else
ALL: test_r
CXXFLAGS = -c -O3
endif
test_d: test.do
g++ -o $@ $^
test_r: test.ro
g++ -o $@ $^
%.do: %.cpp
g++ $(CXXFLAGS) $< -o $@
%.ro: %.cpp
g++ $(CXXFLAGS) $< -o $@
简单说一下,Makefile根据ver的不同定义了不同的编译选项CXXFLAGS与输出程序ALL,
debug版本输出程序是test_d,release版本输出程序是test_r
debug版本编译选项是"-c -g -Ddebug",release版本编译选项是"-c -O3"
debug版本object文件后缀是".do",release版本object文件后缀是".ro"
debug版本编译选项使用"-D"定义宏debug,使得your code能够执行。
不同版本的编译选项、object文件、输出程序均不同,所以可以同时编译两个版本的程序,互不影响。
Makefile执行时,首先判断ver变量,如果ver的值是debug,编译debug版,否则编译release版。当然,默认情况下是编译debug版的。
如果想编译release版,要怎么做?
只要在执行make时,对ver变量赋值,使得ver的值不为debug,比如
# make ver=release
如何在makefile中指定头文件目录
指定头文件目录,一般都bai是通过编译器参du数-I(大写的I)来指定的,
假设头文zhi件目录在:
/home/develop/include
则可以通过:
-I/home/develop/include
将该目录添加到头文件搜索路径中
在makefile中则可以这样写:
CFLAGS=-I/home/develop/include
然后在你编译的时候,引用CFLAGS即可,如:
yourapp:*.c
gcc $(CFLAGS) -o yourapp