如何在C (LINUX)中使用makefile执行某个部分



我正在开发一个C program,它调用2个函数,func1()func2()

代码

void func1(void){/*...*/}
void func2(void){/*...*/}
int main(){
func1();
func2();

return 0;
}

是否有一种方法,当我使用makecertain flagcompile程序时,它只是执行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

callmakeusing:

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

最新更新