前言
有时候我们想要makefile给c代码传入参数,来控制c代码的不同走向。
这时候可以在编译时传入-D参数,效果等价于在c代码中执行了
#define xxx 宏定义
示例1
c代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include "math.h"
#include "stdio.h"
#include "stdlib.h"
// #if defined(LHK_DEF)
#ifdef LHK_DEF
#define PHY_CNT PHY_CNT_36
#else
#define PHY_CNT PHY_CNT_48
#endif
#define PHY_CNT_36 (36)
#define PHY_CNT_48 (48)
int main(int argc, char* argv[])
{
printf("PHY_CNT:%d \n", PHY_CNT);
#ifdef LHK_DEF
printf("define LHK_DEF\n");
#else
printf("not define LHK_DEF\n");
#endif
return 0;
}
Makefile
#Makefile
target=lhk
obj=main.o
CFLAGS += -DLHK_DEF
#obj+=test.o
#生成可执行文件
$(target):$(obj)
gcc -o $@ $^
%.o: %c
#gcc -c -o $@ $<
gcc $(CFLAGS) -c -g -o $@ $<
#清除
.PHONY clean:
clean:
rm -rf $(target) *.o
在Makefile中控制选择“gcc -c -o $@ $<” 或者 “gcc $(CFLAGS) -c -g -o $@ $< ”,在代码中控制PHY_CNT数值
注: 手动测试可以使用 gcc -DLHK_DEF main.c -o lhk
示例2
我们想在make编译时候传入不同参数,定义不同的预编译宏,并将该宏传给C代码。
makefile示例程序
#Makefile
CC=gcc
CFLAGS=-c -g -Wall
RM=rm -rf
OBJ=main.o
ifeq ($(arch), x86)
CFLAGS+=-DARCH_X86
$(info "[info] x86")
else ifeq ($(arch), arm)
CFLAGS+=-DARCH_ARM
$(info "[info] arm")
else
$(info "[info] others")
endif
$(info "[info] CFLAGS:$(CFLAGS)")
main:$(OBJ)
$(CC) $+ -g -o $@
main.o:main.c
$(CC) $(CFLAGS) $+ -o $@
.PHONY:clean
clean:
$(RM) *.o main
c函数
//main.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
#if defined(ARCH_X86)
printf("x86\n");
#elif defined(ARCH_ARM)
printf("arm\n");
#else
printf("others\n");
#endif
return 0;
}
演示效果
注意:这里make编译时候加了-B参数,是为了让makefile强制编译C代码。因为makefile只有检测到c代码有修改才重新编译,我们C代码没有修改,这时候不会被编译,预定义宏也就不会传入到c代码中。
除了执行make时使用-B参数外,还可以先执行make clean 再进行make。