전체 makefile 예제는 다음과 같습니다.
makefile
TARGET = prog
$(TARGET): main.o lib.a
gcc $^ -o $@
main.o: main.c
gcc -c $< -o $@
lib.a: lib1.o lib2.o
ar rcs $@ $^
lib1.o: lib1.c lib1.h
gcc -c -o $@ $<
lib2.o: lib2.c lib2.h
gcc -c -o $@ $<
clean:
rm -f *.o *.a $(TARGET)
메이크 파일 설명 :
target: prerequisites
-룰 헤드
$@
-목표를 의미
$^
-모든 전제 조건을 의미
$<
-첫 번째 전제 조건을 의미
ar
-아카이브를 생성, 수정 및 추출하는 Linux 도구에 대한 자세한 내용은 매뉴얼 페이지를 참조하십시오 . 이 경우의 옵션은 다음을 의미합니다.
r
-아카이브 내에 존재하는 파일을 교체
c
-아직 존재하지 않는 경우 아카이브를 만듭니다.
s
-아카이브에 객체 파일 인덱스를 만듭니다.
결론 : 리눅스에서 정적 라이브러리는 객체 파일의 아카이브에 지나지 않습니다.
lib를 사용하는 main.c
#include <stdio.h>
#include "lib.h"
int main ( void )
{
fun1(10);
fun2(10);
return 0;
}
lib.h libs 메인 헤더
#ifndef LIB_H_INCLUDED
#define LIB_H_INCLUDED
#include "lib1.h"
#include "lib2.h"
#endif
lib1.c 첫 번째 lib 소스
#include "lib1.h"
#include <stdio.h>
void fun1 ( int x )
{
printf("%i\n",x);
}
lib1.h 해당 헤더
#ifndef LIB1_H_INCLUDED
#define LIB1_H_INCLUDED
#ifdef __cplusplus
extern “C” {
#endif
void fun1 ( int x );
#ifdef __cplusplus
}
#endif
#endif /* LIB1_H_INCLUDED */
lib2.c 두 번째 lib 소스
#include "lib2.h"
#include <stdio.h>
void fun2 ( int x )
{
printf("%i\n",2*x);
}
lib2.h 해당 헤더
#ifndef LIB2_H_INCLUDED
#define LIB2_H_INCLUDED
#ifdef __cplusplus
extern “C” {
#endif
void fun2 ( int x );
#ifdef __cplusplus
}
#endif
#endif /* LIB2_H_INCLUDED */