2017-01-04 3 views
0

У меня есть эта makefileСохранить объектные файлы в одном каталоге Makefile, используя в зависимости

appname := fun 

srcfiles := $(shell find .. -name "*.cpp") 
headerfiles := $(shell find .. -name "*.hpp") 
objects := $(patsubst %.cpp, %.o, $(srcfiles)) 


all: $(srcfiles) $(appname) 

$(appname): $(objects) 
    $(CXX) $(LDFLAGS) -o $(appname) $(objects) $(LDLIBS) 

depend: .depend 

.depend: $(srcfiles) $(headerfiles) 
    rm -f ./.depend 
    $(CXX) $(CXXFLAGS) -MM $^>>./.depend; 

clean: 
    rm -f $(appname) $(objects) 

dist-clean: clean 
    rm -f *~ .depend 

include .depend 

Где makefile «s родительский каталог содержит весь код (.hpp и .cpp файлов). К сожалению, файлы .o сохраняются в исходном коде, а я хочу, чтобы они были сохранены в том же каталоге исполняемого файла (и makefile). То же самое относится к Default в Eclipse CDT.

Как я могу изменить makefile, чтобы сделать это?

PS: Я нашел похожие вопросы, например this, но один из них не использовал depend для определения задачи $(objects) (все они в форме% .o%).

ответ

1

Когда вы устанавливаете переменную objects, вы просто берете полный путь к файлу .cpp и заменяете суффикс .o. Поэтому, если у вас есть файл my/sub/dir/foo.cpp, то objects будет содержать путь my/sub/dir/foo.o. Итак, конечно, когда вы пишете правило $(appname): $(objects), make собирается попытаться построить файл my/sub/dir/foo.o. Если вы хотите построить только foo.o вместо этого, то вам придется сдирать путь, а не просто заменить суффикс:

objects := $(patsubst %.cpp,%.o,$(notdir $(srcfiles))) 

Теперь, конечно, сделать будет сказать, что не знает, как построить foo.o, потому что правила по умолчанию знают, как построить .o от .cpp, а не от файла .cpp, спрятанного в my/sub/dir.

Чтобы сделать эту работу наиболее простым решением является use VPATH и вы можете построить значение для VPATH из списка каталогов, которые вы получили от srcfiles, например, так:

VPATH := $(sort $(dir $(srcfiles))) 

Вы могли бы также рассмотреть возможность использования более зависимость например, the one described here.

Смежные вопросы