Nasıl BASİT C Makefile yapmak için?
Bir proje için, her şeyi birlikte çekmek için bir makefile kullanmak için gereklidir, ama iğrenç hocamız asla ne olduğunu bize gösterdi.
Ben sadece BİR dosya var, a3driver.cpp var. Sürücü ithalatı bir yerden bir sınıf "/user/cse232/Examples/example32.sequence.cpp".
İşte bu, her şey ile yer alıyor .cpp.
Nasıl çalıştırılabilir bir dosya oluşturur basit bir Makefile yapma hakkında gitmek istiyorsunuz""? a3a.exe
CEVAP
Wiki bir yazı kopyalanmış fizik yüksek lisans öğrencileri için yazdım.
Bu unıx için olduğundan yürütülebilir dosyalar uzantısız.
Unutulmaması gereken bir şey root-config
kök karşı bina uygulamaları için doğru derleme ve bağlama bayrakları; ve kütüphaneler sağlayan bir araçtır. O sadece bir detay bu belge için orijinal izleyici ile ilgili.
Bana Bebek Yapmak
Ya Sen Hiç Yapılan İlk geldiğin Zaman Unutmayın
Basit bir makefile yazmak için ne yapmak tanıtım bir tartışma
Yapmak nedir? Ve Neden Umursayayım?
Aracı inşa bağımlılık yöneticisidir yapmak denir. Yani, kaynak dosyaları, nesne dosyaları, kütüphaneler, başlıklar, vb bir koleksiyon komutları almak için ne yapılacağına bilmenin bakım yazılım projesi sürüyor. - .- vb-son zamanlarda---programın güncel bir sürümü doğru dönüştürerek değişmiş olabilir.
Aslında başka şeyler yapmak için de kullanabilirsiniz, ama bu konuda konuşmak için gitmiyorum.
Önemsiz Bir Makefile
Sanırım bu bir dizin içeren: tool
tool.cc
tool.o
support.cc
support.hh
, ve support.o
emek root
ve güya derlenmiş içine adında bir program tool
ve sanırım bu bulundun hack kaynak dosyaları ve derleme programı.
Bunu kendiniz yapmak olabilir
1) varsa support.cc
support.hh
ya gibi bir komut çalıştırmak support.o
ve daha yeni olup olmadığını kontrol edin
g -g -c -D_REENTRANT -pthread -I/sw/include/root support.cc
2) ya da support.hh
tool.cc
gibi bir komut çalıştırmak tool.o
ve daha yeni olup olmadığını kontrol edin
g -g -c -D_REENTRANT -pthread -I/sw/include/root tool.cc
3) EÄŸer tool.o
gibi bir komut çalıştırmak tool
ve daha yeni olup olmadığını kontrol edin
g -g tool.o support.o -L/sw/lib/root -lCore -lCint -lRIO -lNet -lHist -lGraf -lGraf3d -lGpad -lTree -lRint \
-lPostscript -lMatrix -lPhysics -lMathCore -lThread -lz -L/sw/lib -lfreetype -lz -Wl,-framework,CoreServices \
-Wl,-framework,ApplicationServices -pthread -Wl,-rpath,/sw/lib/root -lm -ldl
Vay! Ne kavgaymış! Hatırlamak için çok fazla ve hata yapmaya çok fırsat var. (Komut satırlarını ayrıntıları burada sergilenen BTW-- yazılım çevremize bağlıdır. Bunlar benim bilgisayarda çalışır.)
Tabii ki, sadece üç komutları her zaman çalıştırabilir. Bu işe yarardı, ama yazılım önemli bir parçası (15 dakikadan fazla benim MacBook üzerinde sıfırdan derlemek için aldığı KÖPEKLER gibi) ölçekli görünmüyor.
Bunun yerine bir dosya makefile
denilen bu gibi yazabilirsiniz:
tool: tool.o support.o
g -g -o tool tool.o support.o -L/sw/lib/root -lCore -lCint -lRIO -lNet -lHist -lGraf -lGraf3d -lGpad -lTree -lRint \
-lPostscript -lMatrix -lPhysics -lMathCore -lThread -lz -L/sw/lib -lfreetype -lz -Wl,-framework,CoreServices \
-Wl,-framework,ApplicationServices -pthread -Wl,-rpath,/sw/lib/root -lm -ldl
tool.o: tool.cc support.hh
g -g -c -D_REENTRANT -pthread -I/sw/include/root tool.cc
support.o: support.hh support.cc
g -g -c -D_REENTRANT -pthread -I/sw/include/root support.cc
ve sadece komut satırında make
. üç adımda otomatik olarak yukarıda gösterilen gerçekleştirecek.
BM-girintili satırları burada form var< . em ^"hedef:" . bağımlılıklar ve söyle ilişkili komutları (girintili çizgiler) bağımlılıkları herhangi bir hedeften daha yeni ise hızlı olmalı. Bu çizgiler çeşitli dosyalarında değişiklikler yapabilmek için yeniden inşa edilmesi gereken şey mantığını açıklamak bağımlılık. support.cc
support.o
anlamına gelir bu değişiklikler yeniden inşa edilmesi gerektiği, ancak tool.o
yalnız bırakılabilir. support.o
deÄŸiÅŸtiÄŸinde tool
yeniden inÅŸa edilmesi gerekir.
Komutları her bağımlılık hat ile ilgili bir sekme (aşağıya bakınız) hedef (ya da en azından değişiklik saati güncellemek için dokunun) değiştirmelisiniz ile yola çıktık.
Değişkenler, Kurallar ve Diğer Güzellikler İçinde İnşa edilmiş
Bu noktada, bizim makefile sadece yapılması gereken işleri hatırlamakta, ama biz hala anlamaya ve bütünüyle her gerekli komut yazmak zorunda. Bu şekilde olmak zorunda değil. bizim için bu çok daha kolay yapabilirsiniz. değişkenleri, metin işleme fonksiyonları ve yerleşik kurallar bir bütün döndürmek ile güçlü bir dildir
DeÄŸiÅŸkenler Olun
Bir değişken erişmek için sözdizimi $(VAR)
.
Değişken bir atama sözdizimi: VAR = A text value of some kind
(ya VAR := A different text value but ignore this for the moment
).
Bizim makefile bu geliÅŸtirilmiÅŸ versiyonu gibi kurallar deÄŸiÅŸkenleri kullanabilirsiniz:
CPPFLAGS=-g -D_REENTRANT -pthread -I/sw/include/root
LDFLAGS=-g
LDLIBS=-L/sw/lib/root -lCore -lCint -lRIO -lNet -lHist -lGraf -lGraf3d -lGpad -lTree -lRint \
-lPostscript -lMatrix -lPhysics -lMathCore -lThread -lz -L/sw/lib -lfreetype -lz \
-Wl,-framework,CoreServices -Wl,-framework,ApplicationServices -pthread -Wl,-rpath,/sw/lib/root \
-lm -ldl
tool: tool.o support.o
g $(LDFLAGS) -o tool tool.o support.o $(LDLIBS)
tool.o: tool.cc support.hh
g $(CPPFLAGS) -c tool.cc
support.o: support.hh support.cc
g $(CPPFLAGS) -c support.cc
biraz daha okunabilir, ama yine de yazarak bir sürü gerektirir
Fonksiyonları Olun
GNU sistemi üzerindeki dosya sistemi bilgileri erişim için fonksiyonları veya diğer komutları destekliyor. Bu durumda biz ilgilendi $(shell ...)
genişletir çıkış değişken(ler) ve $(subst opat,npat,text)
değiştirir örnekleri opat
44* metin.
Bu yararlanarak verir bize:
CPPFLAGS=-g $(shell root-config --cflags)
LDFLAGS=-g $(shell root-config --ldflags)
LDLIBS=$(shell root-config --libs)
SRCS=tool.cc support.cc
OBJS=$(subst .cc,.o,$(SRCS))
tool: $(OBJS)
g $(LDFLAGS) -o tool tool.o support.o $(LDLIBS)
tool.o: tool.cc support.hh
g $(CPPFLAGS) -c tool.cc
support.o: support.hh support.cc
g $(CPPFLAGS) -c support.cc
yazın daha kolay ve çok daha okunabilir.
Dikkat edin
- Hala açıkça her nesne dosyası bağımlılıklarını ve son yürütülebilir belirten
- Açıkça hem kaynak dosyalarını derleme türü kurala zorunda kaldık
Örtülü ve model Kurallar
Genellikle tüm c kaynak aynı şekilde tedavi edilmelidir dosyaları beklenir, ve bu üç devlet için olduğunu sağlar
- kurallar (eski GNU olun, ama geriye doğru uyumluluk için tutulur kabul) soneki
- örtük kurallar
- model kurallar
Örtük kurallar inşa edilmiştir ve bunlardan bazıları aşağıda ele alınacaktır. Örüntü kuralları gibi formda belirtilir
%.o: %.c
$(CC) $(CFLAGS) $(CPPFLAGS) -c $<
nesne dosyaları c kaynak gösterilen komut çalıştırarak dosyalarından oluşturulan anlamına gelir, "otomatik" değişken $<
ilk bağımlılık adı genişletir.
Yerleşik Kuralları
Çok sık, bir proje çok basit bir makefile tarafından derleme, aslında olabilir anlamına yerleşik kurallar bir bütün ana vardır.
GNU inşa c kaynak dosyaları yukarıdaki yaşandığı için bir kural olun. Benzer şekilde c kaynak $(CXX) -c $(CPPFLAGS) $(CFLAGS)
gibi bir kural ile dosyaları dosyaları nesne oluşturuyoruz
Tek bir nesne birden çok nesne dosyaları dosyaları bağlamak istiyorum çünkü $(LD) $(LDFLAGS) n.o $(LOADLIBES) $(LDLIBS)
, ama bu işe yaramaz kullanarak bizim durumumuzda bağlıdır.
Değişken, Yerleşik Kuralları Tarafından Kullanılır
Yerleşik kuralları yeniden yazma kuralları olmadan yerel çevre bilgisi (KÖK dosya vardır nerede gibi) belirtmek için izin veren standart değişken bir dizi kullanın. Olanlar bize ilginç olabilir:
CC
-- c derleyici kullanmak içinCXX
-- c derleyici kullanmak içinLD
-- kullanmak için bağlayıcıCFLAGS
-- c kaynak dosyalarını derleme bayrağıCXXFLAGS
-- c için derleme bayrakları kaynak dosyalarıCPPFLAGS
-- c-işleyişi için bayraklar (genellikle dosya yolları ve semboller komut satırında tanımlı dahil), c ve c tarafından kullanılırLDFLAGS
-- linker flagsLDLIBS
-- bağlantı kitaplıkları
Temel Makefile
Kurallar inÅŸa yararlanarak bizim makefile basitleÅŸtirmek:
CC=gcc
CXX=g
RM=rm -f
CPPFLAGS=-g $(shell root-config --cflags)
LDFLAGS=-g $(shell root-config --ldflags)
LDLIBS=$(shell root-config --libs)
SRCS=tool.cc support.cc
OBJS=$(subst .cc,.o,$(SRCS))
all: tool
tool: $(OBJS)
$(CXX) $(LDFLAGS) -o tool $(OBJS) $(LDLIBS)
tool.o: tool.cc support.hh
support.o: support.hh support.cc
clean:
$(RM) $(OBJS)
dist-clean: clean
$(RM) tool
Ayrıca özel eylemleri gerçekleştiren birkaç standart hedef (kaynak dizini temizlemek gibi) ekledik.
Unutmayın olun çağrılır olmadan bir argüman, kullandığı ilk hedef buldum dosyayı (bu durumda), ama aynı zamanda adı hedef almak ne yapar make clean
Kaldır nesne dosyaları bu durumda.
Biz hala tüm bağımlılıkları kodlanmış.
Bazı Gizemli Gelişmeler
CC=gcc
CXX=g
RM=rm -f
CPPFLAGS=-g $(shell root-config --cflags)
LDFLAGS=-g $(shell root-config --ldflags)
LDLIBS=$(shell root-config --libs)
SRCS=tool.cc support.cc
OBJS=$(subst .cc,.o,$(SRCS))
all: tool
tool: $(OBJS)
$(CXX) $(LDFLAGS) -o tool $(OBJS) $(LDLIBS)
depend: .depend
.depend: $(SRCS)
rm -f ./.depend
$(CXX) $(CPPFLAGS) -MM $^>>./.depend;
clean:
$(RM) $(OBJS)
dist-clean: clean
$(RM) *~ .depend
include .depend
Dikkat edin
- Artık kaynak dosyaları için bağımlılık çizgiler var!?!
- Garip bir büyü ile ilgilidir .bağlı ve bağımlı
make
ls -A
o zaman yaparsan bağımlılık hatları yapmak gibi şeyler içeren bir dosya.depend
adında
DiÄŸer Okuma
- GNU make manual
- Yazılı ortak bir yolda Recursive Make Considered Harmful yetersiz olduğunu ve bunu önlemek için ne makefiles.
Böcek ve Tarihsel Notlar
Yapmak için giriş dilini boşluk duyarlıdır. Özelliklebağımlılıkları aşağıdaki eylem hatları bir sekme ile başlamalıdır. Ama bir dizi boşluk olabilir bak aynı (ve aslında orada editörler olacak sessizce dönüştürmek sekmeler için boşluk ya da tam tersi), hangi sonuçları bir dosya görünüyor ama yine de çalışmıyor. Bu bir hata olarak erken teşhis edildi ama (the story goes) zaten 10 kullanıcı vardı çünkü sabit değildi.
Nasıl bir div kalan Yatay Boşluk (CSS ...
Nasıl div içeriğini daha büyük değil y...
Nasıl dava Vim / küçük harf duyarlı ar...
Nasıl twitter bootstrap menü hover yer...
Sekmeler arasında geçiş yapmak için na...