Linux'ta gcc için nasıl basit bir makefile oluşturabilirim?


130

Ben üç dosya vardır: program.c, program.hve headers.h.

program.ciçerir program.hve headers.h.

Bunu Linux üzerinde gcc derleyicisini kullanarak derlemem gerekiyor . Bunu nasıl yapacağımdan emin değilim. Netbeans benim için bir tane yarattı, ama boş.


1
Spin.atomicobject.com/2016/08/26/makefile-c-projects adresinde son derece zarif (ve iyi belgelenmiş) bir çözüm var .
Casey

Yanıtlar:


193

İlginç, kaynak dosyalar ile ilgili kurallar verilen C derleyicisini varsayılan olarak kullanacağını bilmiyordum.

Her neyse, basit Makefile kavramlarını gösteren basit bir çözüm şöyle olacaktır:

HEADERS = program.h headers.h

default: program

program.o: program.c $(HEADERS)
    gcc -c program.c -o program.o

program: program.o
    gcc program.o -o program

clean:
    -rm -f program.o
    -rm -f program

(make'in boşluk girintisi yerine sekme gerektirdiğini unutmayın, bu yüzden kopyalarken bunu düzelttiğinizden emin olun)

Ancak, daha fazla C dosyasını desteklemek için, her biri için yeni kurallar oluşturmanız gerekir. Böylece iyileştirmek için:

HEADERS = program.h headers.h
OBJECTS = program.o

default: program

%.o: %.c $(HEADERS)
    gcc -c $< -o $@

program: $(OBJECTS)
    gcc $(OBJECTS) -o $@

clean:
    -rm -f $(OBJECTS)
    -rm -f program

Bunu, genellikle makefiles dosyasında görülen $ (CC) ve $ (CFLAGS) gibi değişkenleri atlayarak olabildiğince basit hale getirmeye çalıştım. Bunu anlamakla ilgileniyorsanız, umarım bu konuda size iyi bir başlangıç ​​yapmışımdır.

İşte C kaynağı için kullanmayı sevdiğim Makefile. Kullanmaktan çekinmeyin:

TARGET = prog
LIBS = -lm
CC = gcc
CFLAGS = -g -Wall

.PHONY: default all clean

default: $(TARGET)
all: default

OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c))
HEADERS = $(wildcard *.h)

%.o: %.c $(HEADERS)
    $(CC) $(CFLAGS) -c $< -o $@

.PRECIOUS: $(TARGET) $(OBJECTS)

$(TARGET): $(OBJECTS)
    $(CC) $(OBJECTS) -Wall $(LIBS) -o $@

clean:
    -rm -f *.o
    -rm -f $(TARGET)

.C ve .h dosyalarını geçerli dizine otomatik olarak eklemek için make yardımcı programının joker karakterini ve patsubst özelliklerini kullanır, yani dizininize yeni kod dosyaları eklediğinizde Makefile'ı güncellemeniz gerekmez. Ancak, oluşturulan yürütülebilir dosyanın, kitaplıkların veya derleyici bayraklarının adını değiştirmek isterseniz, yalnızca değişkenleri değiştirebilirsiniz.

Her iki durumda da, lütfen autoconf kullanmayın. Sana yalvarıyorum! :)


7
Teknik olarak doğru olmak gerekirse .PHONY: clean all default, komut satırından kullanılması amaçlanan hedefler için kullanmanız gerektiğine inanıyorum . Ayrıca, Autoconf / Automake o kadar da kötü değil. Elbette, kendilerini berbat hissediyorlar ve onlara alışmak, kafanızı bir tuğla duvara zorlamak kadar eğlenceli, ama işe yarıyorlar ve iyi gelişmişler ve taşınabilirlik açısından üssünüzün çoğunu kapsıyorlar. ve korkunç tasarımlarına alıştığınızda sonunda hayatınızı çok daha kolaylaştıracak.
Chris Lutz

Sanırım bu işe yarıyor, ancak terminalde "make" yazarsam programın çalışması gerektiğini düşündüm. Bunu elde ediyorum: gcc statsh.o -Wall -lm -o prog Sadece make yazıp programı çalıştırmak mümkün mü?
user69514

openmp bayrağını nereye eklersiniz -fopenmp
MySchizoBuddy

1
Neden autoconf joey-adams'ı kullanmıyorsunuz?
Michal Gonda

7
Biri neden önünde tire olduğunu merak ederse rm: stackoverflow.com/questions/2989465/rm-rf-versus-rm-rf
Tor Klingberg

25

Örneğin bu basit Makefile yeterli olmalıdır:

CC = gcc 
CFLAGS = -Wall

tümü: program
program: program.o
program.o: program.c program.h başlıkları.h

temiz:
    rm -f program programı.o
Programı çalıştır
    ./program

<tab>Temizlik ve çalıştırmadan sonraki satırda boşluk olmaması gerektiğini unutmayın .

GÜNCELLEME Aşağıdaki yorumlar uygulandı


@ user69514: makebağımsız değişken olmadan genellikle sadece inşa yazılımınızı. Çalıştırmak için, ya kullanın make run(bu yanıtta mevcuttur, ancak her durumda olması gerekmez Makefile) ya da doğrudan çalıştırın:./program
MestreLion

14
all: program
program.o: program.h headers.h

yeterlidir. gerisi örtülü


1
Ve tüm programınız tek bir .cdosyaysa, yalnızca program:gereklidir. Tatlı :)
MestreLion

10

En basit oluşturma dosyası olabilir

all : test

test : test.o
        gcc -o test test.o 

test.o : test.c
        gcc -c test.c

clean :
        rm test *.o

Makefile dosyanızın ne yaptığını açıklamak için daha fazla ayrıntı ekleyebilirsiniz
Federico

2
aslında çok daha basite gidebilirsiniz. bkz. @anonymous 1 astar
Mark Lakata

0

Başlık sayısına ve geliştirme alışkanlıklarınıza bağlı olarak, gccmakedep'i araştırmak isteyebilirsiniz. Bu program mevcut dizininizi inceler ve makefile'ın sonuna her .c / cpp dosyası için başlık bağımlılıklarını ekler. Bu, 2 başlığınız ve bir program dosyanız olduğunda aşırıdır. Ancak, 5'ten fazla küçük test programınız varsa ve 10 başlıktan birini düzenliyorsanız, make'in yaptığınız değişikliklerle değiştirilen programları tam olarak yeniden oluşturacağına güvenebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.