Nasıl SRC, N, BİN alt ile C proje için bir Makefile oluşturabilir miyim?
Birkaç ay önce, okul ödevleri için: Makefile
aşağıdaki genel ile geldim
# ------------------------------------------------
# Generic Makefile
#
# Author: yanick.rochon@gmail.com
# Date : 2010-11-05
#
# Changelog :
# 0.01 - first version
# ------------------------------------------------
# project name (generate executable with this name)
TARGET = projectname
CC = gcc -std=c99 -c
# compiling flags here
CFLAGS = -Wall -I.
LINKER = gcc -o
# linking flags here
LFLAGS = -Wall
SOURCES := $(wildcard *.c)
INCLUDES := $(wildcard *.h)
OBJECTS := $(SOURCES:.c=*.o)
rm = rm -f
$(TARGET): obj
@$(LINKER) $(TARGET) $(LFLAGS) $(OBJECTS)
@echo "Linking complete!"
obj: $(SOURCES) $(INCLUDES)
@$(CC) $(CFLAGS) $(SOURCES)
@echo "Compilation complete!"
clean:
@$(rm) $(TARGET) $(OBJECTS)
@echo "Cleanup complete!"
Bu temelde .c
ve 8 ** dosyası her .o
dosyalarını oluşturmak için derleme ve hepsi aynı klasörde 10 ** yürütülebilir.
Şimdi, bu biraz zorlamak istiyorum.Nasıl aşağıdaki dizin yapısı ile C proje derleme için bir Makefile yazabilirim?
./
./Makefile
./src/*.c;*.h
./obj/*.o
./bin/<executable>
DiÄŸer bir deyiÅŸle, ./obj/
içine ./src/
C kaynaklardan derlediÄŸi bir Makefile ve her ÅŸeyi ./bin/
yürütülebilir oluşturmak için daha sonra bağlantı istiyorum.
Farklı Makefiles okumayı denedim, ama ben sadece onları proje yapı iş üstünde yapamaz; bunun yerine, proje hataları her türlü ile derlemek için başarısız olur. Tabii, tam gaz IDE (Monodevelop, Anjuta, vb.), kullanabilirim ama ben dürüst' terminal. gEdit ol ve iyi bir sopa ile tercih
Bana çalışan bir çözüm, ya da bunun nasıl yapılacağı hakkında net bir bilgi verebilecek bir guru var mı? Teşekkür ederim!
**GÃœNCELLEME (v4)**
Nihai çözüm :
# ------------------------------------------------
# Generic Makefile
#
# Author: yanick.rochon@gmail.com
# Date : 2011-08-10
#
# Changelog :
# 2010-11-05 - first version
# 2011-08-10 - added structure : sources, objects, binaries
# thanks to http://stackoverflow.com/users/128940/beta
# ------------------------------------------------
# project name (generate executable with this name)
TARGET = projectname
CC = gcc
# compiling flags here
CFLAGS = -std=c99 -Wall -I.
LINKER = gcc -o
# linking flags here
LFLAGS = -Wall -I. -lm
# change these to set the proper directories where each files shoould be
SRCDIR = src
OBJDIR = obj
BINDIR = bin
SOURCES := $(wildcard $(SRCDIR)/*.c)
INCLUDES := $(wildcard $(SRCDIR)/*.h)
OBJECTS := $(SOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o)
rm = rm -f
$(BINDIR)/$(TARGET): $(OBJECTS)
@$(LINKER) $@ $(LFLAGS) $(OBJECTS)
@echo "Linking complete!"
$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.c
@$(CC) $(CFLAGS) -c $< -o $@
@echo "Compiled "$<" successfully!"
.PHONEY: clean
clean:
@$(rm) $(OBJECTS)
@echo "Cleanup complete!"
.PHONEY: remove
remove: clean
@$(rm) $(BINDIR)/$(TARGET)
@echo "Executable removed!"
CEVAP
Ä°lk olarak, $(OBJECTS)
kural sorunlu, çünkü 1) gelişigüzel çeşit, yapmatümkaynakları her nesne, 2.) Sık kullanıryanlış kaynak(olarak keşfetti file1.o
file2.o
) 3) çalışır oluşturmak için çalıştırılabilir yerine durdurma nesneler, ve 4) adı hedef (foo.o
) ne kuralı olur aslında üretmek (obj/foo.o
). Aşağıdaki öneriyorum
OBJECTS := $(SOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o)
$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
@echo "Compiled "$<" successfully!"
$(TARGET)
kural hedef adı kural oluşturur aslında açıklanmayan aynı sorun var. Bu nedenle make
birkaç kez yazarsanız, Yapmak için bir neden yok olsa bile, hedefi her zaman yeniden. Küçük bir değişiklik düzeltmeleri:
$(BINDIR)/$(TARGET): $(OBJECTS)
$(LINKER) $@ $(LFLAGS) $(OBJECTS)
@echo "Linking complete!"
Herşey bir kez daha karmaşık bağımlılık işleme düşünebilirsiniz; başlık dosyaları değiştirirseniz, bu makefile/yürütülebilir yeniden inşa edilmesi gerekir. Ama bu başka bir gün için sabırsızlanıyorum.
DÃœZENLEME:
Üzgünüm, $(OBJECTS)
kural bir parçası yukarıda atlanmış; onu düzelttim. ("" İçinde bir kod örneği.) grev kullanmak isterdim
Nasıl bir proje içinde tek bir dosya i...
Eclipse'de yeni bir proje Maven Java 1...
Nasıl Git deposu için boş bir dizin ek...
Nasıl bağımlılıkları Maven kullanarak ...
Nasıl bir dize dönüştürmek için yığın ...