C语言 在Makefile中,我应该如何将头文件放入先决条件列表中?(头文件包括函数内部的执行代码行)

nqwrtyyt  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(144)

有时候我们必须处理一个头文件,它包含了使用宏或变量的内联代码片段,这些宏或变量是在以前的include文件中定义的。我在尝试使C对象文件依赖于所包含的头文件时遇到了这样的问题。所以我在stackoverflow上查找了它,找到了this,但发帖者的问题过于复杂,所以看起来他没有得到预期的答案。所以我在这里做了一个简单的例子。
--主. c

#include <stdio.h>
#define ADDVAL 32
int val;
void set_val(int);
int main()
{
set_val(10);
#include "print_val.h"
return 0;
}

--设置值. c

extern int val;
void set_val(int a)
{
val += a;
}

--打印值. h

printf("added value = %d\n",val + ADDVAL);

当然我可以像这样编译和运行程序。

$cc -c main.c -o main.o
$cc -c set_val.c -o set_val.o
$cc main.o set_val.o -o main
$./main
added value = 42

现在使用Makefile..我创建了这个Makefile。

csrcs := $(wildcard *.c)
cobjs := $(patsubst %.c, %.o, $(csrcs))
main: $(cobjs)
    cc $^ -o $@
clean:
    \rm -f *.o main

当我做的时候,它工作得很好。

$make
cc    -c -o set_val.o set_val.c
cc    -c -o main.o main.c
cc set_val.o main.o -o main

当然问题是,当我修改print_val. h时,它不会重新生成main。
所以我在目标'main'的先决条件列表中添加了头文件,如下所示。

csrcs := $(wildcard *.c)
cobjs := $(patsubst %.c, %.o, $(csrcs))
main: $(cobjs) print_val.h
    cc $^ -o $@
clean:
    \rm -f *.o main

现在,在清理之后,如果我做了,我会看到错误。

$ make
cc    -c -o set_val.o set_val.c
cc    -c -o main.o main.c
cc set_val.o main.o print_val.h -o main
print_val.h:1:8: error: expected declaration specifiers or ??...?? before string constant
    1 | printf("added value = %d\n",val + ADDVAL);
      |        ^~~~~~~~~~~~~~~~~~~~
print_val.h:1:29: error: unknown type name ??val??
    1 | printf("added value = %d\n",val + ADDVAL);
      |                             ^~~
make: *** [Makefile:4: main] Error 1

此头文件包含执行行,无法自行编译此文件。
我该怎么处理呢?

wqsoz72f

wqsoz72f1#

依赖于头文件的是main.o文件,而不是main可执行程序文件。
因此,您只需要为目标文件添加依赖项:

main.o: print_val.h

只需将该行添加到makefile的末尾即可。

相关问题