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

165 篇文章 51 订阅
41 篇文章 7 订阅

目录

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

 

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
条件编译技术是程序开发中常用的一种编译技术,可以根据条件选择是否编译某些代码段。本文将介绍条件编译技术的基本原理、使用方法和注意事项。 一、基本原理 条件编译技术是通过预处理指令来实现的。预处理器在编译代码之前会对代码进行扫描,遇到预处理指令就会根据指令中的条件选择是否编译相应的代码段。常用的预处理指令包括: 1. #ifdef:如果定义了宏,则编译后面的代码段。 2. #ifndef:如果未定义宏,则编译后面的代码段。 3. #if:根据指定的表达式判断是否编译后面的代码段。 4. #elif:在#if指令中添加一个新的判断条件。 5. #else:在#if和#elif指令的条件不成立时,编译后面的代码段。 6. #endif:结束#if指令。 二、使用方法 条件编译技术可以用于以下几种情况: 1. 根据不同操作系统选择编译代码:例如,可以使用#ifdef指令来判断当前操作系统是否为Windows,从而编写不同的代码。 ``` #ifdef _WIN32 // Windows平台下的代码 #else // 非Windows平台下的代码 #endif ``` 2. 根据不同编译器选择编译代码:例如,可以使用#ifdef指令来判断当前编译器是否为GCC,从而编写不同的代码。 ``` #ifdef __GNUC__ // GCC编译器下的代码 #else // 非GCC编译器下的代码 #endif ``` 3. 根据宏定义选择编译代码:例如,可以使用#ifdef或#ifndef指令来判断宏是否被定义过,从而编写不同的代码。 ``` #ifdef DEBUG // 调试模式下的代码 #else // 非调试模式下的代码 #endif ``` 4. 根据不同版本选择编译代码:例如,可以使用#if指令来判断当前版本是否支持某些特性,从而编写不同的代码。 ``` #if __cplusplus >= 201103L // 支持C++11特性的代码 #else // 不支持C++11特性的代码 #endif ``` 三、注意事项 在使用条件编译技术时,需要注意以下几点: 1. 不要滥用条件编译技术,否则会导致代码难以维护。 2. 不要在条件编译指令中使用复杂的表达式,否则会增加代码的复杂度。 3. 尽量避免使用#define指令定义宏,因为宏定义可能会覆盖其他代码的定义。 4. 在使用条件编译技术时,一定要保证代码的可移植性,避免因为平台差异或编译器差异导致代码不能正常工作。 总之,条件编译技术可以帮助我们编写更加灵活、可移植和优化的代码,但需要注意使用方法和注意事项,以确保代码的质量和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值