Nasıl SRC, N, BİN alt ile C proje için bir Makefile oluşturabilir miyim? | Netgez.com
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

  • Call Me Howard

    Call Me Howa

    18 AÄžUSTOS 2012
  • Electro Posé

    Electro PosÃ

    21 ÅžUBAT 2013
  • TurkishRoyal

    TurkishRoyal

    16 Ocak 2007