정적 라이브러리 링크
라이브러리 중 정적 라이브러리(static library)를 사용하는 경우가 종종 있다. 그리고 해당 라이브러리가 또 다른 (static library)를 Link 하는 경우가 있다. 이럴 때 문제가 발생하게 된다. 아래와 같이 어플리케이션이 필요로 하는 정적 라이브러리를 링크하게 되는데, 해당 라이브러리가 다른 정적 라이브러리를 링크하게 되는 경우이다.
** Application --> Static library 1 --> Static library 2 **
Application은 Static library 1의 존재만 알 뿐 2의 존재는 알지도, 알 필요도 없다.
pkg-config를 이용한 경우 pc 파일에 정의
아래 libpalosalodp 의 pc.in 파일이다.
# Package Information for pkg-config
prefix=@prefix@
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include/
Name: libtest
Description: test library
Version: 0.0.1
Requires.private: libtest_internal >= 0.0.1
Libs: -L${libdir} -ltest
Cflags: -I${includedir} \
-I${includedir}/Include
Requires.private 에서 libodp_internal_${sdktype} 에 대한 필요 정보를 명시하고, 다른 Application의 Makefile에서 pkg-config --static 옵션을 붙여서 추가 시 해당 lib을 추가해준다.
Requires.private 은 이 패키지에 필요한 패키지 목록을 나타내는 것으로 동적 링크된 실행 파일(static이 지정되지 않은 경우)에 대해
플래그 목록을 계산할 때 고려되지 않는다.
Requires 사용하기
# Package Information for pkg-config
prefix=@prefix@
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include/
Name: libtest
Description: test library
Version: 0.0.1
Requires: libtest_internal >= 0.0.1
Libs: -L${libdir} -ltest
Cflags: -I${includedir} \
-I${includedir}/Include
Requires 옵션을 이용하여 포함시킨다.
Requires와 Requires.private의 차이는 아래와 같다.
Requires: 패키지가 의존하여 사용하는 다른 패키지의 이름의 목록으로 공백으로 구분한다. 비교 연산자(=, <, >, <=, >=)를 사용하여 버전을 지정할 수도 있다.
Requires.private: 패키지가 의존하여 사용하는 다른 패키지의 이름의 목록으로 공백으로 구분한다. 단 Requires와 다르게 패키지 안에서만 사용하며 이 패키지를 가져다가 사용하는 애플리케이션에는 사용할 필요 없을 패키지를 나열한다. 버전을 지정하는 형식은 Requires와 동일하다.
하지만 정적 라이브러리를 링크하고 있는 상황이기 때문에, Requires를 사용하던지 Application은 pkg-config 에서 --static 을 사용해야만 Requires.private에 정의된 패키지를 사용할 수 있다.
'Linux > Compile & Link' 카테고리의 다른 글
[Dynamic linker] ld.so / ld-linux.so* 의 동작 간단 분석 (작성 중) (0) | 2021.05.16 |
---|---|
[gcc] 특정 코드에 최적화 속성 사용하기 (0) | 2019.05.14 |
[gcc] Warning option 정리 (0) | 2019.05.14 |