2010-07-27 28 views
0

我最近開始爲C++項目編寫單元測試(使用GoogleTest)。構建主項目非常簡單:我使用GCC的-MM-MD標誌來自動生成我的目標文件的依賴關係,然後將所有目標文件鏈接到一起以便輸出可執行文件。沒有驚喜。自動選擇目標文件進行編譯

但是,當我正在編寫單元測試時,有沒有辦法讓make或GCC找出哪些目標文件需要編譯每個測試?現在,我有一個相當幼稚的解決方案(如果可以這樣稱呼它的話),它將所有可用的目標文件編譯在一起進行每個單元測試,這顯然是浪費的(無論在時間和空間方面)。有沒有一種方法(使用make,gcc,sed或其他方法)以類似於如何爲原始源文件生成依賴關係的方式來預測給定單元測試需要哪些對象文件?

回答

1

這聽起來像你有兩組源文件:一個實際上實現你的程序,另一個是所有的單元測試。我假設每個單元測試都有自己的main函數,單元測試永遠不需要互相調用。

如果是這樣,您可以將第一組中的所有文件放入靜態庫中,並將每個單元測試與該庫鏈接。鏈接器將自動從庫中拉取所需的對象文件。

在具體的Makefile方面:

LIBRARY_OBJECTS = a.o b.o c.o d.o # etc 
UNIT_TESTS = u1 u2 u3 u4 # etc 
UNIT_TEST_OBJECTS = $(UNIT_TESTS:=.o) 

libprogram.a: $(LIBRARY_OBJECTS) 
     ar cr [email protected] $? 

$(UNIT_TESTS): %: %.o libprogram.a 
     $(CC) $(CFLAGS) -o [email protected] $< -lprogram 
+0

謝謝,@Zack - 擊中了頭部。 – 2010-08-02 23:31:32

1

您應該看看更高的項目管理抽象,如CmakeGNU Automake

+0

大衛·惠勒說:「在計算機科學中的所有問題都可以用間接的另一個層面來解決。」所以,當你做出有效的觀察時(你的建議不會置若罔聞),它並不直接回答這個問題。 – 2010-07-27 14:43:20

+0

爲了澄清,我假設你已經明白了make target:dependencies的語法。在重讀你的問題時,我看到了足夠的含糊不清,以致不清楚。如果您實際上是在尋求這方面的指導,我會將您推薦給rlduffy的答案,因爲它正在按照您的需要進行。不過,我認爲你正在尋求更高水平的自動化。 – Eli 2010-07-27 16:44:56

0

在你的Makefile

 SOURCES.cpp = a.cpp b.cpp ... 
    OBJECTS = $(SOURCES.cpp:%.cpp=%.o) 

    all: program 

    program: $(OBJECTS) 
      $(LINK) -o [email protected] $(OBJECTS) 
0

也許,這取決於您的測試系統是如何有序。

如果有頭文件和源文件之間一個很好的一個一對一的關係,那麼你可以使用一些文本轉換功能(或調用SED)的轉換你已經有機器生成的規則:

foo.o: foo.cc foo.h bar.h gaz.h 

轉化爲相應的測試規則:

unit_test_foo: unit_test_foo.o foo.o stub_bar.o stub_gaz.o 

或者,如果你使用了大量的存根沒有相應的頭文件(這是一個警告信號),你可以只是 stub_foo.o每存根鏈接。這些目標文件很小,不會經常更改,所以很便宜。