SORU
10 AĞUSTOS 2011, ÇARŞAMBA


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
10 AĞUSTOS 2011, ÇARŞAMBA


İ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

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Matus Slovak

    Matus Slovak

    5 Temmuz 2007
  • TechnoBuffalo

    TechnoBuffal

    8 HAZİRAN 2007
  • The White House

    The White Ho

    21 Ocak 2006