8. static, shared library makefile
Program Lang./Makefile 2013. 5. 18. 14:111. Makefile Rule for static library build
static library는 archive library라고도 불리고, 빌드를 위한 Makefile Rule은 아래와 같다.
[ TAB ] $(AR) $(ARFLGS) $@ @^
또는
[ TAB ] $(AR) $(ARFLGS) $@ @? # 변경이 있는 object만을 반영하기 위해서는 $? 사용
여기서 $(AR)은 ar 명령어를 나타내며, 사용법과 옵션은 아래와 같다. $(ARFLGS)의 기본값은 rv이다.
option |
설명 |
r |
오브젝트를 삽입, 이미 같은 이름이 있으면 대체한다. 정적라이블러리를 만든는 표준방법 |
t |
아카이브의 내용을 테이블로 출력, 자세한 출력은 v 옵션을 추가로 설정 |
d |
아카이브에서 지정한 오브젝트를 삭제 |
마지막으로 archive library는 자신이 포함하고 있는 심볼에 대해서 index정보를 가지고 있어야 한다. 현재 GNU같은
최신 make는 자동으로 ar 명령어가 생성하지만 그렇지 않은 make는 아래와 같은 추가 작업이 필요하다.
라이블러리이름(확장자 a) : archive library를 구성하는 object member들 기술
[ TAB ] $(RANLIB) $@
정적 라이블러리 생성 룰과 index 생성 룰을 하나로 합쳐서 만들면 더 좋겠죠...
2. Makefile Rule for shared library build
정적 라이블러리가 빌드과정에서 모든 라이블러리를 실행파일에 포함시키는 구조라면 동적 라이블러리는 빌드 중에는
라이블러리 사용에 대한 정보만 포함하고 실제 로딩은 실행파일 실행 중에 수행한다. 따라서 동적 라이블러리는
이를 만족하기 위해서 추가적으로 몇가지 단계가 필요하다. 두 라이블러리 간의 차이점과 사용법은 해당 부분 참조 바람.
단계별로 살펴보면 다음과 같다.
1) 위치 독립적인 코드 생성 : -fPIC 컴파일 옵션으로 object 파일 생성
2) 공유 라이블러리 생성 : -shared 컴파일 옵션 추가
3) 동적 라이블러리를 Alias를 이용해 생성: -\, soname, 옵션
2), 3)은 동일하게 동적 라이블러리를 생성하는 방법이지만 3)은 좀 더 관리를 효율적으로 하기위해서 사용한다.
여기서 일일이 모든 것을 기술하면 지문이 지저분해지므로 라이블러리 이용편을 참조
3. 예제 Rule
아래 예제는 정적과 동적 라이블러리를 만들어내는 rule이고, 동적 라이블러리 생성 시에는 -fPIC 옵션이 들어가야한다.
@echo "static library building : "\$@\""
@test -d $(lib_dir) || mkdir -p $(lib_dir)
@rm -rf $@
@$(AR) $(ARFLGS) $@ $?
$(shared_lib) : $(objects)
@echo "shared library building : "\$@\""
@test -d $(lib_dir) || mkdir -p $(lib_dir)
@rm -rf $@
@$(CC) -shared --\l,-soname,$@.0 -o $@.0.0.0 $?
@ln -f $(notdir $@.0.0.0) $@
추가적으로 동적 라이블러리는 그 관리 및 사용상의 특징으로 세가지의 파일이 필요하다.
위 동적 라이블러리 생성 rule에서 $@.0.0.0 형태의 동적 라이블러리만 만들어진다.
하지만 실제 실행 시에는 -soname에 명시된 이름을 실행 파일에서 찾게된다. 따라서 이를 위해 링크를 생성해줘야 한다.
마지막으로 빌드 중 링크과정에서 확인하는 라이블러에 대해서도 링크를 걸어줘야 한다.
아래 매크로(함수)는 그런 기능을 수행하는 것으로 install Target에서 호출하면 일을 덜 수 있다.
$(call make_symlink, libcurl.so.7.31.0, libcurl.so) # 빌드 중 링크 과정에서 필요한 라이블러리 생성
$(call make_symlink, libcurl.so.7.31.0, libcurl.so.7) # 실행 중 필요한 Allias 라이블러리 생성
'Program Lang. > Makefile' 카테고리의 다른 글
6. source와 object 분리 (0) | 2013.05.13 |
---|---|
5. Makefile Rules (0) | 2013.05.13 |
1. basic makefile structure syntax (0) | 2013.05.11 |
3. VPATH(vpath), conditional and include 지시자 (0) | 2013.05.09 |
4. variable and macros (0) | 2013.05.09 |