SORU
20 Mart 2010, CUMARTESİ


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
20 Mart 2010, CUMARTESİ


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

  1. Hala açıkça her nesne dosyası bağımlılıklarını ve son yürütülebilir belirten
  2. 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

  1. kurallar (eski GNU olun, ama geriye doğru uyumluluk için tutulur kabul) soneki
  2. örtük kurallar
  3. 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çin
  • CXX -- c derleyici kullanmak için
  • LD -- 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ır
  • LDFLAGS -- linker flags
  • LDLIBS -- 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

  1. Artık kaynak dosyaları için bağımlılık çizgiler var!?!
  2. Garip bir büyü ile ilgilidir .bağlı ve bağımlı
  3. make ls -A o zaman yaparsan bağımlılık hatları yapmak gibi şeyler içeren bir dosya .depend adında

Diğer Okuma

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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Blendtec

    Blendtec

    30 EKİM 2006
  • DigitalRev TV

    DigitalRev T

    30 AĞUSTOS 2007
  • Jeremy Stark

    Jeremy Stark

    23 Mayıs 2010