簡體   English   中英

如何在能夠移動源文件的同時使用gcc的自動依賴項生成?

[英]How can I use gcc's automatic dependency generation while being able to move source files?

考慮一個簡單的項目,該項目的源位於兩個不同的目錄中: src用於手寫代碼, gen用於生成的代碼。

生成文件:

 foo: foo.o main.o gcc $^ -o $@ COMPILE = gcc -MD -MP -MF $(@:.o=.d) -Isrc -Igen -c $< -o $@ %.o: src/%.c $(COMPILE) %.o: gen/%.c $(COMPILE) -include $(wildcard *.d) 

src / main.c

 #include "foo.h" #include <stdio.h> int main() { printf("%d\\n", foo()); return 0; } 

src / foo.h

 int foo(void); 

src / foo.c

 #include "foo.h" int foo() { return 42; } 

這很好用,包括依賴項跟蹤:

 $ make gcc -MD -MP -MF foo.d -Isrc -Igen -c src/foo.c -o foo.o gcc -MD -MP -MF main.d -Isrc -Igen -c src/main.c -o main.o gcc foo.o main.o -o foo $ touch src/foo.h $ make gcc -MD -MP -MF foo.d -Isrc -Igen -c src/foo.c -o foo.o gcc -MD -MP -MF main.d -Isrc -Igen -c src/main.c -o main.o gcc foo.o main.o -o foo 

-MP甚至允許我將標頭移到gen/而不破壞構建:

 $ mv src/foo.h gen/ $ make gcc -MD -MP -MF foo.d -Isrc -Igen -c src/foo.c -o foo.o gcc -MD -MP -MF main.d -Isrc -Igen -c src/main.c -o main.o gcc foo.o main.o -o foo 

但是不幸的是,我不能在沒有破壞一切的情況下移動非標題:

 $ mv src/foo.c gen/ $ make make: *** No rule to make target 'src/foo.c', needed by 'foo.o'. Stop. 

這是因為GCC生成的依賴關系規則如下所示:

 $ cat foo.d foo.o: src/foo.c /usr/include/stdc-predef.h gen/foo.h /usr/include/stdc-predef.h: gen/foo.h: 

foo.o: src/foo.c依賴防止make使用gen/foo.c我已經搬到了上去。 如果不存在,一切都會起作用:

 $ sed -i 's|src/foo.c ||' foo.d $ make make: 'foo' is up to date. 

有沒有一種方法可以使它自動運行,或者使用不同的GCC標志或通過某種方式更改Makefile?

您以一種不尋常的方式使用依賴項(我不想說錯 ;))。 第一次編譯僅從模式規則進行,因為依賴文件尚不存在。 此后,您在移動文件時會失去同步,然后調用包含舊路徑文件的舊依賴文件的構建。 Make並非設計為在沒有適當而僵化的目標信息的情況下運行,因為這將導致完全不受控制的構建-如果名稱合適,為什么不編譯文件anotherproject / notyourbusiness / foo.c? (*)

因此,如果您想執行此操作,則由於任何隱式功能都將使它們變得完全無用,因此您被迫正確地對其進行顯式編程。 您可以使用VPATH(將其設置為可能顯示源代碼的目錄,並從依賴文件中的先決條件中刪除路徑信息)來定位源代碼,但請注意,即使是為了捕獲難以捉摸的項目范圍,也沒有添加此代碼。

總而言之,我敢說,如果您的源文件的位置在整個項目中造成如此大的麻煩,那么您就處在艱難時期-但這並不是說允許進行此類配置更改的靈活makefile是不好的事情,只是不要安裝“正常”構建步驟之類的行為。

(*)當然,依賴項生成可以滯后一個周期,但這與以不受控制的方式來回移動目標不同

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM