有时候我们必须处理一个头文件,它包含了使用宏或变量的内联代码片段,这些宏或变量是在以前的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
此头文件包含执行行,无法自行编译此文件。
我该怎么处理呢?
1条答案
按热度按时间wqsoz72f1#
依赖于头文件的是
main.o
文件,而不是main
可执行程序文件。因此,您只需要为目标文件添加依赖项:
只需将该行添加到makefile的末尾即可。