2017-08-25 147 views
0

我想知道如果有動態編譯使用生成文件的方式只選定的文件。 假設我有a.cppb.cppc.cpp文件。這些是我想比較其運行時的一些算法。 首先,我只想編譯a和b文件,然後執行以查看結果。 接下來,我想編譯b和c並運行。編譯使用動態生成文件

它不只是一個順序,a和b可以被編譯或b和c,或a和c或(a,b和c)共。這種使用makefile

我該怎麼辦?

+1

是的,你可以使用一個Makefile什麼。你試一試。 –

+0

我想輸入一個請求,認爲你是不可以的:)這是完全可行的,但它使得維護者的生活變得不幸,除非它的處理非常謹慎。如果你編譯的東西只能在同一個平臺上運行,那就太好了。但是如果你需要交叉編譯,你最終會嘗試執行爲不同平臺構建的東西。太可怕了。但是,如果你真的需要這樣做,請提供更多關於你想要達到的內容的信息。 –

+0

@KevinBoone我想要做的是比較算法的計算時間。現在,我有一個非常簡單的makefile來編譯每個cpp文件(算法代碼)。但我正在考慮創建一個文本文件作爲配置文件來指定用戶想要通過註釋執行的算法的名稱。 – Q123

回答

1

不確定如何「比較」運行時,所以此示例僅通過time命令打印它們,但如果需要,可以使用awk和gnuplot生成圖。每個目標只是指定要運行的shell命令。 %用於根據模式定義目標。

all: ab bc 

%.out: %.cpp 
    gcc $< -o [email protected] 

ab: a.out b.out 
    time ./a.out && time ./b.out 

bc: b.out c.out 
    time ./b.out && time ./c.out 

(確保縮進標籤)

+0

我想比較這些算法的方式就像例如我有一個軌跡數據,我希望這些算法能夠壓縮數據並查看每個算法所需的時間。首先,我想比較a和b算法,然後比較b和c。 – Q123

0

雖然編譯器和Makefile可能被工作要做到這一點,身份證建議你做到這一點。重組你的程序。

例如我猜你有一個像test_runner.cppalgorithm_a.cppalgorithm_b.cpp

例如使用algorthim進行測試的模板函數。然後將其用於每個實現。

template<class T> void test_implementation() { ... do stuff with T to test it ... } 

void main() 
{ 
    test_implementation<A>(); 
    test_implementation<A>(); 
} 

所以,首先,把它們製作成一個程序用於測試是什麼壞事?然後,您可以按順序運行和計算這兩種算法,或者可以使用命令行參數?

交替地,如果你認爲test_runner.cpp是一個庫,那麼你的兩個algorthimns測試是單獨的程序,只是使用該庫。

還需要一些時間來學習的makefile語法。一旦你理解語法的解決方案應該是顯而易見的,但所有的事情仍然不是你應該適用於這種情況的東西。

1

是,這僅僅是依賴順序的問題:它看起來是這樣的:

all: results_ab results_bc 
    #compare results... 

results_ab: a.o b.o 
    # link, and run, and store results 

results_bc: results_ab b.o c.o 
    # link, run and store results. 
+0

但是如果我想編譯每個文件(a,b和c)? 這不是一個訂單,用戶將決定哪個文件將被編譯。 – Q123