[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 ) 도 앞에 추가 해주어야 정상적으로 링킹이 가능하다 


이 블로그의 인기 게시물

Crusader Kings 3 - Converting DNA code using Portrait Editor