Direktori proyek saya terlihat seperti ini:
/project
Makefile
main
/src
main.cpp
foo.cpp
foo.h
bar.cpp
bar.h
/obj
main.o
foo.o
bar.o
Apa yang saya ingin makefile saya lakukan adalah mengkompilasi semua .cpp
file di /src
folder ke .o
file di /obj
folder, lalu menautkan semua .o
file /obj
ke dalam biner keluaran di folder tingkat atas /project
.
Saya hampir tidak memiliki pengalaman dengan Makefiles, dan saya tidak begitu yakin apa yang harus dicari untuk mencapai ini.
Juga, apakah ini cara yang "baik" untuk melakukan ini, atau adakah pendekatan yang lebih standar untuk apa yang saya coba lakukan?
c++
build-process
makefile
Austin Hyde
sumber
sumber
Jawaban:
Makefile bagian dari pertanyaan
Ini cukup mudah, kecuali Anda tidak perlu menggeneralisasi, coba sesuatu seperti kode di bawah ini (tetapi ganti indentasi spasi dengan tab di dekat g ++)
Pembuatan grafik ketergantungan otomatis
Sebuah fitur "harus" untuk kebanyakan sistem make. Dengan GCC dapat dilakukan dalam sekali jalan sebagai efek samping dari kompilasi dengan menambahkan
-MMD
tanda keCXXFLAGS
dan-include $(OBJ_FILES:.o=.d)
di akhir badan makefile:Dan seperti yang telah disebutkan orang-orang, selalu ada GNU Make Manual , ini sangat membantu.
sumber
OBJ_FILES = $(patsubst src/%.cpp,obj/%.o,$(CPP_FILES))
.$<
harus$^
untuk aturan main.exe dan saya pikir ada kesalahan ketikobj/%.o: src/%cpp
.make: *** No rule to make target '/main.o', needed by 'bin/main'. Pare.
Wildcard juga berfungsi untuk saya, tetapi saya ingin memberikan catatan tambahan bagi mereka yang menggunakan variabel direktori. Selalu gunakan garis miring untuk pohon folder (bukan garis miring terbalik), jika tidak maka akan gagal:
sumber