我正在开发一个C program
,它调用2个函数,func1()
和func2()
。
代码
void func1(void){/*...*/}
void func2(void){/*...*/}
int main(){
func1();
func2();
return 0;
}
是否有一种方法,当我使用make
和certain flag
compile
程序时,它只是执行func1()
,如果我使用另一个标志编译,那么它只执行func2()
?
如何制作这样的makefile
?谁能给我提供一个makefile做这项工作?
您可以使用编译器的-D
标志:
cc -o demo demo.c -Dfunc=func1
然后
#include <stdio.h>
void func1(void) { puts("1"); }
void func2(void) { puts("2"); }
int main(void)
{
func();
return 0;
}
输出:
1
您也可以将函数作为参数传递给make
:
CC = gcc
CFLAGS = -std=c11 -Wpedantic -Wall
action: demo.c
$(CC) $(CFLAGS) demo.c -o demo -Dfunc=$(argument)
clean:
rm -f demo
callmake
using:
make action argument=func1
或
make action argument=func2
但是如果你真的想这样做:
int main(){
func1();
func2();
在main
内部调用这两个函数,您应该使用另一种方法(尽管这种解决方案对我来说似乎相当棘手):
#include <stdio.h>
void func0(void) { /* do nothing */ }
void func1(void) { puts("1"); }
void func2(void) { puts("2"); }
#ifdef delete_func1
#define func1 func0
#endif
#ifdef delete_func2
#define func2 func0
#endif
int main(void)
{
func1();
func2();
return 0;
}
编译使用:
cc -o demo demo.c -Ddelete_func1
或
cc -o demo demo.c -Ddelete_func2
那么Makefile
应该看起来像:
CC = gcc
CFLAGS = -std=c11 -Wpedantic -Wall
func1: demo.c
$(CC) $(CFLAGS) demo.c -o demo -Ddelete_func2
func2: demo.c
$(CC) $(CFLAGS) demo.c -o demo -Ddelete_func1
clean:
rm -f demo
调用:
make func1
或
make func2
你可以使用-D
删除两个函数两次:
cc -o demo demo.c -Ddelete_func1 -Ddelete_func2