2014-12-05 52 views
0

我對makefile很新,但想用一些單元測試創​​建一個C++項目。Makefile創建幾個電源作爲單元測試C++

我的項目目錄如下:

makefile 
src/ 
    main.cpp 
    file1.cpp 
    file1.h 
    file2.cpp 
    file2.h 
    ... 
test/ 
    file1_test.cpp 
    file2_test.cpp 
    ... 

我希望Makefile編譯程序的src /並編譯在我的測試/目錄下的程序。每個* _test.cpp文件都包含一個main()函數。我嘗試了很多東西,但每次我嘗試編譯時遇到了一些新問題,感覺它應該是一件相當簡單的事情。

感謝您的幫助(順便說一句,我被這個教程http://c.learncodethehardway.org/book/ex28.html啓發)!

編輯:

我現在的makefile文件看起來是這樣的。 (我不得不做一些更改以適應這個更一般的例子)

CFLAGS = 
LIBS = 
LDFLAGS = -L/usr/local/ 
CC = g++ 
SOURCES=$(wildcard src/**/*.cpp src/*.cpp) 
OBJECTS=$(patsubst %.cpp,%.o,$(SOURCES)) 

TARGET=build/MyProgram 

TEST_SRC=$(wildcard test/*_test.cpp) 
TESTS=$(patsubst %.cpp,%.o,$(TEST_SRC)) 
TESTS_PRG=$(patsubst %.cpp,%,$(TEST_SRC)) 
TESTS_OBJ=$(patsubst test/%_test.cpp,src/%.o,$(TEST_SRC)) 

all: $(TARGET) 

$(TARGET): build $(OBJECTS) 
     g++ -o $(OBJECTS) $(CFLAS) $(LIBS) 

build: 
     @mkdir -p build 
     @mkdir -p bin 

.PHONY: tests 
tests: $(TESTS_OBJ)                                   
     g++ $(TESTS_OBJ) $(CFLAGS) -o $(TESTS_PRG)                           

clean: 
     rm -rf build $(OBJECTS)                                
     rm -f tests/tests.log 
     find . -name "*.gc*" -exec rm {} \; 
     rm -rf `find . -name "*.dSYM" -print` 
+0

你目前的makefile是什麼樣的? – 2014-12-05 20:31:40

+0

你應該發佈你的makefile,並考慮使用CMake和CTest。 – yayuj 2014-12-05 20:35:48

+0

是否有一個特定的原因,您沒有使用automake並進行檢查? – midor 2014-12-05 20:58:52

回答

0

我在原地修復了空白錯誤後,運行makefile。但是,如果我這樣做,我不會得到你聲稱的行爲:從g ++得到一個錯誤,告訴我第二個file1_test不存在,如預期的那樣。爲了得到你聲稱的行爲,我必須刪除'tests'規則配方行末尾的-o $ {TESTS_PRG}。原因如下:

您不能指定多個輸出文件(-o)來爲編譯器的一次調用生成多個程序。如果刪除了-o $ {TESTS_PRG},那麼編譯器會嘗試從指定的所有對象文件($ {TESTS_OBJ})中創建一個程序,並且每個程序可能都有一個main()例程,因爲它們應該是不同的程式。每個程序需要一次調用編譯器。