有时我们必须处理包含内联代码片段的头文件,这些代码片段使用了先前包含文件中定义的宏或变量。在试图使C对象文件依赖于包含的头文件时,我遇到了这样的问题。所以我在stackoverflow上查了一下,发现了这个,但是海报的问题是不必要的复杂,所以似乎他没有得到预期的答案。我在这里做了一个简单的例子。
- c
#include <stdio.h>
#define ADDVAL 32
int val;
void set_val(int);
int main()
{
set_val(10);
#include "print_val.h"
return 0;
}
——set_val.c
extern int val;
void set_val(int a)
{
val += a;
}
——print_val.h
printf("added value = %dn",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时,它工作得很好。
$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_value .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 = %dn",val + ADDVAL);
| ^~~~~~~~~~~~~~~~~~~~
print_val.h:1:29: error: unknown type name ??val??
1 | printf("added value = %dn",val + ADDVAL);
| ^~~
make: *** [Makefile:4: main] Error 1
这个头文件包含执行行,这个文件不能自己编译。
我该如何处理??
是依赖于头文件的main.o
文件,而不是main
可执行程序文件。
所以你只需要为object文件添加依赖项:
main.o: print_val.h
只需在makefile的末尾添加这一行。