【GCC】gcc条件编译和make 传参gcc|Makefile 带参数
目录
gcc条件编译
myprogram.c代码中:
#ifdef UMP_TO_FILE
//do something here...
#endif
gcc编译时:
gcc myprogram.c -D UMP_TO_FILE
-D加上宏UMP_TO_FILE,相当于你在代码中#define UMP_TO_FILE
-D UMP_TO_FILE = 1,相当于你在代码中#define UMP_TO_FILE 1
-D name
Predefine name as a macro, with definition 1.
-D name=definition
The contents of definition are tokenized and processed as if they appeared during translation phase three in a #define directive. In particular, the definition will be truncated by embedded newline characters.
连接:https://www.it1352.com/784764.html
make 传参
原文:https://blog.csdn.net/lala0903/article/details/111188228
需求:
在开发测试阶段用debug版本,而上线发布用release版本。使用Makefile定制编译不同版本,避免修改程序和Makefile文件。
过程:
比如,有一个test.cpp,包含这段代码
#ifdef DEBUG
//your debug code
#endif
你希望在debug版本要执行your debug code,在release版本不执行your debug code。
我们可以写这样的一个Makefile:
ver = DEBUG #初值-默认值
ifeq ($(ver), DEBUG) #make ver=release的时候传参
ALL: test_d
CXXFLAGS = -c -g -D DEBUG
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变量,如果ver的值是DEBUG,编译DEBUG内的代码,否则编译RELEASE版。当然,默认情况下是编译DEBUG版的。
如果想编译RELEASE版,要怎么做?
只要在执行make时,对ver变量赋值,使得ver的值不为DEBUG,比如
# make ver=RELEASE
更多详细定制:
https://blog.csdn.net/bandaoyu/article/details/83312151
https://blog.csdn.net/bandaoyu/article/details/89002912
在Makefile中使用
原文:https://blog.csdn.net/lala0903/article/details/111188228
代码写好之后有时候需要在编译的时候选择编译哪部分代码,通过gcc参数 -D给c文件传递宏参数,下面是具体实现,-D和参数中间空格可以省略
makefile参数传递,make para=value
例子:
myprint.c
#include <stdio.h>
#ifdef DEBUG
const char *g_vision = "宏参数是debug";
#else /* DEBUG */
const char *g_vision = "宏参数是relese";
#endif /* DEBUG */#if (FLAG == 1)
int g_flag = 1;
#else /* FLAG */
int g_flag = 0;
#endif /* FLAG */int main(int argc, char *argv[])
{
printf("%s, flag = %d\n", g_vision, g_flag);
for (int i = 0; i < argc; i++) {
printf("argv[%d] = %s\n", i, argv[i]);
}
return 0;
}
Makefile
OBJ=print
CC=gcc
VISION?=DEFAULT
INPUT?=0
$(OBJ):myprint.c
$(CC) -D $(VISION) -D FLAG=$(INPUT) $< -o $@
clean:
rm $(OBJ)
make的时候传参:
make VISION=DEBUG INPUT=1
也可写入脚本:build.sh
#!/bin/bash
read -p "脚本输入测试,传给c文件的flag为:" -t 10 temp
echo "输入的参数值为 flag = ${temp}"
make VISION=${1} INPUT=${temp}
./print 参数1 参数2 参数3
make clean
执行脚本和传参
lala0903@lala0903-virtual-machine:~/c_learn$ ./build.sh DEBUG
脚本输入测试,传给c文件的flag为:1
输入的参数值为 flag = 1
gcc -D DEBUG -D FLAG=1 myprint.c -o print
宏参数是debug, flag = 1
argv[0] = ./print
argv[1] = 参数1
argv[2] = 参数2
argv[3] = 参数3
rm print
###################################################################
lala0903@lala0903-virtual-machine:~/c_learn$ ./build.sh RELESE
脚本输入测试,传给c文件的flag为:2
输入的参数值为 flag = 2
gcc -D RELESE -D FLAG=2 myprint.c -o print
宏参数是relese, flag = 0
argv[0] = ./print
argv[1] = 参数1
argv[2] = 参数2
argv[3] = 参数3
rm print
其他高收藏文章:https://blog.csdn.net/maopig/article/details/7230311
宏定义的方式#ifdef和#if defined()比较
https://blog.csdn.net/bandaoyu/article/details/102689450