2013-09-22 2 views
-1

У меня 3 файла: MyLib.h MyLib.c Tester.c Я пытался создать файл makefile, но это сложно.Makefile C Ubuntu - Возникли проблемы

я могу это сделать, когда это только один файл, как показано ниже, где я компиляции hello.c

Я видел несколько примеров, но они, кажется, намного сложнее, чем тот, который я использую ниже - который для меня это имеет смысл.

BINDIR = /usr/local/sbin 
CC =  gcc 
CFLAGS = -O 

all:  Hello 

Hello: Hello.o 
    ${CC} ${CFLAGS} Hello.o ${LDFLAGS} -o Hello 


Hello.o: Hello.c 
    ${CC} ${CFLAGS} -c Hello.c 


install: all 
    rm -f ${BINDIR}/Hello 
    cp Hello ${BINDIR}/Hello 



clean: 
    rm -f Hello *.o core core.* *.core 

Пожалуйста, помогите.

Я печатал это каждый раз, когда включаю свой компьютер, до сих пор раздражающий.

gcc MyLib.c Tester.c -o Tester 
+0

Спасибо за проголосовать :( –

+0

Какова цель?Создать библиотеку, а затем связать тестер с этим? Или просто создайте один бинарный файл с помощью Mylib. [Ch] и Tester.c? –

+0

В основном это будет делать: gcc MyLib.c Tester.c -o Тестер –

ответ

0

Предположив MyLib.h является зависимость для обоих файлов C, вы должны иметь что-то вроде этого:

# Variables 

CC := gcc 
CFLAGS := -O 


# Link executable 

Tester: MyLib.o Tester.o 
    ${CC} MyLib.o Tester.o ${LDFLAGS} -o Tester 


# Compile object files 

MyLib.o: MyLib.c MyLib.h 
    ${CC} ${CFLAGS} -c -o MyLib.o MyLib.c 

Tester.o: Tester.c MyLib.h 
    ${CC} ${CFLAGS} -c -o Tester.o Tester.c 

и, как только вы получили повесить, как все работает, вы можете использовать автоматические переменные в качестве второго шага в деле сокращения дублирования кода:

# Variables 

CC := gcc 
CFLAGS := -O 


# Link executable 

Tester: MyLib.o Tester.o 
    ${CC} $^ ${LDFLAGS} -o [email protected] 


# Compile object files 

MyLib.o: MyLib.c MyLib.h 
    ${CC} ${CFLAGS} -c -o [email protected] $< 

Tester.o: Tester.c MyLib.h 
    ${CC} ${CFLAGS} -c -o [email protected] $< 

где [email protected] это заменяется именем цели для текущего правила, $< заменяется первым (то есть крайний слева) зависимости, $^ заменяется полным списком зависимостей.

В приведенном выше примере биты после : являются зависимостями, то есть цель слева от : будет сделана/переделана, если какая-либо из зависимостей более поздняя, ​​чем цель. Для каждой из зависимостей make будет искать цель для нее. Итак, для первого раздела он видит, что MyLib.o и Tester.o являются зависимостями для вашего полного исполняемого файла, и он ищет цели для них, которые предоставляются. Находящие цели, они строят их (если необходимо), а затем продолжают строить Tester.

Обратите внимание, что CFLAGS обычно представляет компиляции флаги, так что вам не нужно, чтобы передать их, когда вы только связывающую поскольку ни компиляции не делается в этой точке.

Кроме того, если вы боретесь с такого рода вещи, а затем упростить, и удалить все дополнительные цели (например, clean и install и all) до тех пор, пока у вас есть навык того, что происходит.

0

Сырые, но эффективная:

Tester: 
    gcc MyLib.c Tester.c -o Tester 

Лучше:

CC = gcc 

Tester: MyLib.o Tester.o 
    $(CC) $^ -o [email protected] 

И я просто сделать предположение о зависимости:

MyLib.o Tester.o : MyLib.h 

Более сложный Makefiles возможен , но сейчас это нужно делать.

Смежные вопросы