[Linux] make - 2
이전 예제에서는 소스파일과 헤더파일이 동일한 경로에 있었는데,
이번에는 c파일은 src 폴더에, h파일은 include 폴더에 나누어 위치 시키고 컴파일을 해 보자.
전체적인 구조는 다음과 같다.
/* include/add.h */
int add(int x, int y);
/* src/add.c */
#include <add.h>
int add(int x, int y)
{
return x + y;
}
/* main.c */
#include <stdio.h>
#include <add.h>
int main(void)
{
int value = 0;
value = add(3, 5);
printf("%d\n", value);
return 0;
}
Make 파일은 src 디렉토리에 있고, 헤더파일은 include 디렉토리에 있으므로, -I../include 를 추가 해 주어야 한다.
# src/Makefile
CC = gcc
CFLAGS = -I../include -c
TARGET = result
OBJS = main.o add.o
$(TARGET): $(OBJS)
$(CC) $(OBJS) -o $(TARGET)
%.o: %.c
$(CC) $(CFLAGS) $<
clean:
rm -rf $(OBJS) $(TARGET)
이번엔 스레드를 사용하는 예제를 살펴 보자.
/* src/main.c */
#include <stdio.h>
#include <pthread.h>
void* thread_func(void *data)
{
printf("%s\n", __func__);
}
int main(void)
{
pthread_t thread;
pthread_create(&thread, 0, thread_func, 0);
pthread_join(thread, 0);
return 0;
}
스레드를 사용하므로 링킹단계에서 라이브러리를 추가 해주어야 하므로 -lpthread 를 추가 해 준다.
# src/Makefile
CC = gcc
CFLAGS = -I../include -c
LFLAGS = -lpthread
TARGET = result
OBJS = main.o
$(TARGET): $(OBJS)
$(CC) $(OBJS) -o $(TARGET) $(LFLAGS)
%.o: %.c
$(CC) $(CFLAGS) $<
clean:
rm -rf $(OBJS) $(TARGET)
마지막으로 사용자 정의 라이브러리를 만들고 추가하는 방법을 살펴 보도록 하자.
새로운 소스파일과 헤더파일도 추가하고 라이브러리를 만들어 보자.
/* include/my_math.h */
int add(int x, int y);
int mul(int x, int y);
/* src/add.c */
int mul(int x, int y)
{
return x + y;
}
/* src/mul.c */
int mul(int x, int y)
{
return x * y;
}
/* src/main.c */
#include <stdio.h>
#include <pthread.h>
#include <my_math.h>
void* thread_func(void *data)
{
printf("%s\n", __func__);
printf("%d\n", add(3,5));
printf("%d\n", mul(3,5));
}
int main(void)
{
pthread_t thread;
pthread_create(&thread, 0, thread_func, 0);
pthread_join(thread, 0);
return 0;
}
gcc -c add.c
gcc -c mul.c
정적 라이브러리 만들기
ar rcv libmy_math.a add.o mul.o
라이브러리 아카이브 안에 무엇이 들어있는지 확인 할 때에는 아래 커맨드를 입력 하면 된다.
ar t libmy_math.a
이렇게 만들어진 libmath.a 파일을 다음과 같이 lib 폴더에 옮겨 보자
전체 파일 및 디렉토리 구조는 아래와 같으면 된다.
마지막으로 Makefile 을 작성 해 보자.
# src/Makefile
CC = gcc
CFLAGS = -I../include -c
LFLAGS = -L../lib -lpthread -lmy_math
TARGET = result
OBJS = main.o
$(TARGET): $(OBJS)
$(CC) $(OBJS) -o $(TARGET) $(LFLAGS)
%.o : %.c
$(CC) $(CFLAGS) $<
clean :
rm -rf $(OBJS) $(TARGET)
사용자 정의 라이브러리 파일(libmy_math.a)을 포함해서 링킹하기 위해 -lmy_math 을 추가해주고,
라이브러리 파일이 위치한 경로 ( -L../lib ) 도 앞에 추가 해주어야 정상적으로 링킹이 가능하다