如何在 C 中使用 makefile 执行特定部分 (LINUX)

How to execute a certain part using makefile in C (LINUX)

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

这是代码

void func1(void){/*...*/}
void func2(void){/*...*/}

int main(){
    func1();
    func2();
    
    return 0;
}

有没有一种方法,当我 compile 使用 makecertain flag 的程序时,它只执行 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

调用 make 使用:

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