2016-07-30 56 views
1

我是新來的ifle 我想測試我的主要特定功能。這個功能在c文件裏有很多依賴關係,我甚至無法跟蹤是否可以使用.d文件來編譯所有依賴的c文件?

是否有可能使用該.c文件的.c文件來編譯我的主程序以獲得此函數在我的小應用程序中工作以及.d文件獲取所有依賴關係?

我就在想,如果有可能做這樣的事情

mymain.o : requiredfunctions.d mymain.c 
+0

當你說「依賴性」,你的意思是頭文件(例如' mymain.c'有一行'#include'kitchensink.h'')? – Beta

+0

實際上,「requiredfunctions.c」文件編譯所需的所有c文件 – becks

+0

我知道d文件只包含頭文件,但如果我可以使用它來完成這項工作,儘可能地做到這一點 – becks

回答

1

你似乎誤會源文件,頭文件,目標文件和可執行文件之間的關係。

假設我們有幾個功能:

void alpha(); 
void beta(); 
void gamma(); 
void delta(); 
... 

每個在頭文件alpha.h)被聲明,並在源文件alpha.c)所定義。現在假設這些功能是獨立的;他們不會互相打電話。編譯其中之一(以產生一個目標文件)很簡單:

gcc -c beta.c -o beta.o 

(以下簡稱「-cc -oo」只是一個巧合的-c的意思是「建立一個目標文件」,以及-o手段。 「以下是如何命名結果」)。

我們還有一個函數void octopus(),它調用所有這些函數。我們宣佈它的頭,octopus.h

// octopus.h 
void octopus(); 

,並在源文件中定義它,octopus.c

#include "alpha.h" 
#include "beta.h" 
... 
#include "omega.h" 

void octopus() 
{ 
    ... // calls alpha(), beta(), etc. 
} 

生產目標文件很簡單:

gcc -c octopus.c -o octopus.o 

現在假設我們有一個文件,mymain.c,其中包含main()並調用一些函數:

#include "alpha.h" 
#include "beta.h" 

int main() 
{ 
    alpha(); 
    beta(); 
    return 0; 
} 

構建目標文件mymain.o很簡單:

gcc -c mymain.c -o mymain.o 

構建可執行mymain是稍難:

gcc mymain.o alpha.o beta.o -o mymain 

如果這一切是明確的,那我可以嘗試猜你想要什麼。你想main()打電話給octopus(),並且你想讓Make爲你建立可執行文件即使你不知道列表alpha, beta,... omega,是嗎?

編輯:如果你有文件octopus.d

octopus.o: octopus.c alpha.h beta.h ... omega.h 

,你可以把它變成所需的對象文件的列表:

alpha.o beta.o ... omega.o 

通過多種方法的。

sed 's/.*\.c //;s/h /o /g' octopus.d 

,或者你可以使用make的文本處理函數生成文件中:你可以使用命令行的sed

OBJECTS := $(subst .h,.o,$(filter %.h, $(shell cat octopus.d))) 
+0

正確。這是我想要做的?我只有這個文件的.d文件octobus.c – becks

+0

@becks:如果我告訴你如何將'octopus.d'變成列表'alpha.o beta.o ... omega.o'將那夠了?我問,因爲描述整個鏈條會使這個答案太長。 – Beta

+0

是的,這會回答我的問題 – becks

相關問題