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



有时我们必须处理包含内联代码片段的头文件,这些代码片段使用了先前包含文件中定义的宏或变量。在试图使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的末尾添加这一行。

相关内容

  • 没有找到相关文章

最新更新