Makefile do umieszczania plików obiektowych z plików źródłowych różnych katalogów w jednym, osobnym katalogu?
Używam UnitTest++, aby umożliwić mi tworzenie testów jednostkowych dla kodu C++ (który powinien być zbudowany na Linuksie lub Mac OS X). Mam taką strukturę katalogów:
src
- Foo.cpp
- Bar.cpp
test
- FooTest.cpp
- BarTest.cpp
- Main.cpp
- Makefile
UnitTest++
- libUnitTest++.a
I ten plik Makefile (zaadaptowany z UnitTest++ Makefile) działa ładnie (z GNU make):
test = TestFooAndBar
src = ../src/Foo.cpp \
../src/Bar.cpp
test_src = Main.cpp \
FooTest.cpp \
BarTest.cpp
lib = ../UnitTest++/libUnitTest++.a
objects = $(patsubst %.cpp,%.o,$(src))
test_objects = $(patsubst %.cpp,%.o,$(test_src))
.PHONY: all
all: $(test)
@echo Running unit tests...
@./$(test)
$(test): $(lib) $(test_objects) $(objects)
@echo Linking $(test)...
@$(CXX) $(LDFLAGS) -o $(test) $(test_objects) $(objects) $(lib)
.PHONY: clean
clean:
-@$(RM) -f $(objects) $(test_objects) $(test) 2> /dev/null
%.o : %.cpp
@echo $<
@$(CXX) $(CXXFLAGS) -c $< -o $(patsubst %.cpp,%.o,$<)
[[2]} ale chcę umieścić wszystkie .o pliki w podkatalogu " obj "katalogu " test". Jak zmodyfikować ten plik Makefile, aby to zrobić?
Próbowałem dodać "obj/" do zmiennych objects i test_objects, ale Nie wiem, jak zmodyfikować %.o rule więc wie, gdzie .o pliki są i odnosi się do poprawnych .pliki cpp. Czy muszę tworzyć dwie oddzielne reguły, po jednej dla każdego zestawu.pliki cpp?
Czy byłoby prościej, gdyby zamiast definiowania zmiennych src i test_src, po prostu mam Makefile build a .o (w OBJ/) dla wszystkich.pliki cpp (zarówno w tym samym katalogu co plik Makefile, jak i w ../src/)?
1 answers
Jest więcej niż jeden sposób, aby to zrobić, ale ten jest całkiem dobry (naprawdę powinienem mieć ten hotkeyed).
vpath %.cpp ../src
src = Foo.cpp Bar.cpp
test_src = Main.cpp FooTest.cpp BarTest.cpp
objects = $(patsubst %.cpp,obj/%.o,$(src))
test_objects = $(patsubst %.cpp,obj/%.o,$(test_src))
$(objects): | obj
obj:
@mkdir -p $@
obj/%.o : %.cpp
@echo $<
@$(CXX) $(CXXFLAGS) -c $< -o $@
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-19 22:32:18