Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未使用gcc和makefile为#ifdef定义值_C_Makefile_Conditional Compilation - Fatal编程技术网

未使用gcc和makefile为#ifdef定义值

未使用gcc和makefile为#ifdef定义值,c,makefile,conditional-compilation,C,Makefile,Conditional Compilation,所以我试图学习makefiles如何在c中编译程序,但是我不能用gcc和main.o作为“OBJS”来定义一些东西。我有一个简单的main函数和makefile,我试图在其中定义test main.c #include <stdio.h> int main(){ #ifdef test printf("ok\n"); #else printf("not ok\n"); #endif return 0; } 每次

所以我试图学习makefiles如何在c中编译程序,但是我不能用gcc和main.o作为“OBJS”来定义一些东西。我有一个简单的main函数和makefile,我试图在其中定义test

main.c

#include <stdio.h>

int main(){
    #ifdef test
        printf("ok\n");
    #else 
        printf("not ok\n"); 
    #endif

    return 0;
}
每次我编译我的程序并执行它时,我总是得到输出“notok”,这意味着测试没有定义,有人知道如何使用main.o作为“OBJS”来实现这一点吗。
谢谢

您需要为不链接编译的命令定义

在您的设置中,该命令是隐式的(作为从
*.c
文件中创建
*.o
文件的规则,可以在Make的数据库中找到),但它确实使用了
CFLAGS
Make变量,因此您可以做的是将
-Dtest
添加到
CFLAGS
Make变量中:

OBJS = main.o
CFLAGS = -Dtest -g -Wall
PROGRAM = defineprog

$(PROGRAM): $(OBJS)
    gcc -D test $(OBJS) -o $(PROGRAM)

clean:
    rm -f $(PROGRAM) $(OBJS)

run: $(PROGRAM)
  ./$(PROGRAM)

$(程序):clean$(OBJS)
毫无意义。您告诉make您的程序依赖于创建所有对象文件(
$(OBJS)
)和删除所有对象文件(
clean
)。
-D test
是预处理器选项。当您在对象文件上调用gcc时,它不会做任何事情。(这与make无关。)
OBJS = main.o
CFLAGS = -Dtest -g -Wall
PROGRAM = defineprog

$(PROGRAM): $(OBJS)
    gcc -D test $(OBJS) -o $(PROGRAM)

clean:
    rm -f $(PROGRAM) $(OBJS)

run: $(PROGRAM)
  ./$(PROGRAM)