【GCC】gcc条件编译和make 传参gcc|Makefile 带参数

目录

gcc条件编译

make 传参

在Makefile中使用

宏定义的方式#ifdef和#if defined()比较


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 -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

 

posted on 2022-10-04 01:24  bdy  阅读(85)  评论(0编辑  收藏  举报

导航