■Makefile■
*makefile 은 Rule로 이루어져 있다.
target : dependencies
<tab>command
target : command 부분이 실행되어 나온 결과 파일
dependencies : target을 만들기 위해 사용되는 파일
command : command의 시작은 반드시 tab후 명령어 사용
*기본 예제
// bar.c //
#include <stdio.h>
void bar(void)
{
printf("Good bye, my love \n");
}
// foo.c //
extern void bar(void);
int main(void)
{
bar();
return 0;
}
// makefile //
baz:foo.o bar.o
gcc -o baz foo.o bar.o
foo.o:foo.c
gcc -c foo.c
bar.o: bar.c
gcc -c bar.c
clean:
rm -f baz foo.o bar.o
# ./baz
Good bye, my love
*매크로와 라벨
# ls
func1.c func2.c io.h main.c makefile
#include <stdio.h>
void func1()
{
printf("this is function1 program\n");
}
#include <stdio.h>
void func2()
{
printf("this is function2 program\n");
}
// main.c //
OBJECTS= main.o func1.o func2.o
TARGET= makeprog
$(TARGET): $(OBJECTS)
gcc -o $(TARGET) $(OBJECTS)
main.o: main.c
gcc -c main.c
func1.o: func1.c
gcc -c func1.c
func2.o: func2.c
gcc -c func2.c
clean:
rm -f $(TARGET) $(OBJECTS)
/*
매크로를 사용할때는 $() 사용
미리 정의된 매크로도 있다. 예)CC = gcc
OBJECTS= main.o func1.o func2.o
TARGET= makeprog
CC= gcc //(CC : Macro)
CFLAGS= -c //c파일을 컴파일(CFLAGS : flag)
makeprog: $(OBJECTS)
$(CC) -o $(TARGET) $(OBJECTS)
main.o: main.c
$(CC) $(CFLAGS) main.c
func1.o: func1.c
$(CC) $(CFLAGS) func1.c
func2.o: func2.c
$(CC) $(CFLAGS) func2.c
clean:
rm -f $(TARGET) $(OBJECTS)
*/
*확장자 사용
.SUFFIXES = .c .o =>make가 어느확장자를 가진 파일들을 처리할 것인가
OBJECTS= main.o func1.o func2.o
SRCS= main.c func1.c func2.c
TARGET= makeprog
CC= gcc
CFLAGS= -g -c
$(TARGET): $(OBJECTS)
$(CC) -o $(TARGET) $(OBJECTS)
.c.o :
$(CC) $(CFLAGS) $< =>확장자 규칙을 직접 구현
clean:
rm -f $(TARGET) $(OBJECTS) core
main.o: io.h main.c
func1.o: io.h func1.c
func2.o: io.h func2.c
.c.o : $(CC) $(CFLAGS) -c $< -o $@
'Linux System Programing' 카테고리의 다른 글
[리눅스 시스템 프로그래밍_Day5]세마포어, 뮤텍스 (0) | 2018.12.14 |
---|---|
[리눅스 시스템 프로그래밍_Day4]스레드 (0) | 2018.12.13 |
[리눅스 시스템 프로그래밍_Day3]Multiplexed I/O, 프로세스 (0) | 2018.12.12 |
[리눅스 시스템 프로그래밍_Day2]라이브러리, 파일 (0) | 2018.12.11 |