有時我們不得不處理一個頭檔案,其中包含使用宏或先前包含檔案中定義的變數的行內代碼片段。我在嘗試使 C 目標檔案依賴于包含的頭檔案時遇到了這樣的問題。所以我在 stackoverflow 上查找并發現了這個,但是發布者的問題不必要地復雜,所以他似乎沒有得到預期的答案。所以我在這里做了一個簡單的例子。
-- 主程式
#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;
}
-- 列印值.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,我會看到錯誤。
$ 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
這個頭檔案包含執行行,這個檔案不能自己編譯。
我該如何處理??
uj5u.com熱心網友回復:
它是main.o依賴于頭檔案的檔案,而不是main可執行程式檔案。
所以你只需要為目標檔案添加依賴:
main.o: print_val.h
只需將該行添加到 makefile 的末尾即可。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/534162.html
標籤:C生成文件
下一篇:如何列印鏈表中的所有節點?
