сделать файл, это выглядит нормально? - PullRequest
1 голос
/ 25 марта 2011
all: run

run: test.o list.o matrix.o smatrix.o
    gcc test.o list.o matrix.o smatrix.o -o matrix-mul

list.o: list.c list.h
    gcc -g -c list.c 

matrix.o: matrix.c matrix.h
    gcc -g -std=c99 -c -o matrix.o matrix.c

smatrix.o: smatrix.c smatrix.h
    gcc -g -c -o smatrix.o smatrix.c

test.o: test.c test.h
    gcc -g -c test.c 

У меня было много проблем с созданием make-файла, и я наконец-то заработал.И я просто хочу убедиться, что они в порядке (не только для запуска программы, но и с точки зрения хорошего make-файла)

Один вопрос заключается в том, почему у matrix.o и smatrix.o есть файлы .o встрока gcc -g -c ... где так как list.o и test.o не имеют этой строки ..

Мне пришлось добавить -std = c99, потому что я получаю некоторые странные сообщения об ошибке циклано до сих пор не понимаю, почему мне нужно поместить matrix.o в строку ..

Ответы [ 3 ]

5 голосов
/ 25 марта 2011

Файл в порядке.Это не очень легко обслуживаемо.

На этом сайте есть действительно хорошее руководство по созданию хороших make-файлов: http://mrbook.org/blog/tutorials/make/

Особенно посмотрите на последний пример:

CC=g++
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.cpp hello.cpp factorial.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=hello

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@

.cpp.o:
    $(CC) $(CFLAGS) $< -o $@

Это должно показать вам, как повысить удобство сопровождения (добавьте дополнительные файлы к SOURCES, а все остальное будет сделано автоматически.

1 голос
/ 25 марта 2011

Файл ниже поддерживает make all make depend и make clean - вам нужно изменить только первые строки.Не забудьте make depend, если вы измените включения в любом файле.

TARGET:=matrix-mul
SOURCES:=test.c list.c matrix.c smatrix.c
OBJECTS:=$(SOURCES:%.c=%.o)
CC=gcc
CFLAGS=-g -std=c99 -Wall
LD=gcc
LDFLAGS=


# First target - simply say that we want to produce matrix-mul
all: $(TARGET)

# To create the target we need all .o files, and we link with LD/LDFLAGS
# $@ is the file we're making, aka matrix-mul
$(TARGET): $(OBJECTS)
    $(LD) -o $@ $(OBJECTS) $(LDFLAGS)

#Creating a .o from a .c
# $< is the c file, $@ is the corresponding .o file
.c.o:
    $(CC) $(CFLAGS) -c $< -o $@

# Regenerate dependencies
depend:
    $(CC) $(CFLAGS) -MM $(SOURCES) > .depend

# Remove produced files
clean:
    rm -rf $(OBJECTS) $(TARGET) .depend

# If there's no dependency file, create it
.depend: depend

# Include the autogenerated dependency file
include .depend

РЕДАКТИРОВАТЬ: Если вы хотите, чтобы это было еще более универсальным, вы можете заменить строку SOURCE: = на:

SOURCES:=$(wildcard *.c)

Этот make-файл затем просто соберет TARGET из всех файлов .c в текущем каталоге.

0 голосов
/ 25 марта 2011

Я бы настоятельно рекомендовал добавить цель clean, которая удаляет все ваши промежуточные файлы (вероятно, все файлы .o), например:

clean:
    rm *.o

Для дополнительного кредита поместите все свои *.o файлы в переменную make и используйте эту переменную в качестве цели правила выполнения и после указанной выше команды rm.

Причина, по которой я хочу, чтобы вы это делали, для целей отладки. может быть в том, что вы ошиблись одним из вышеприведенных правил, но, поскольку вы уже создали все свои файлы .o один раз, он просто выбирает старый каждый раз. Если вы выполните make clean перед сборкой, она поймает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...