pkg-config는 컴파일할 때 필요한 라이브러리의 헤더 경로·링크 옵션·버전 정보를 조회하는 도구다. 보통 라이브러리가 제공하는 .pc 메타데이터 파일을 읽는다. 패키지를 다운로드하는 패키지 관리자나 실제 C 컴파일러와는 역할이 다르다.
경로를 하드코딩하지 않는 방법
개발자가 설치 경로를 직접 적는 대신 pkg-config --cflags와 --libs의 결과를 컴파일러에 전달한다. 라이브러리 배치가 다른 환경에서도 해당 메타데이터를 이용할 수 있다는 장점이 있다. 의존 라이브러리 정보도 .pc 파일의 관계에 따라 전달되므로 빌드 설정을 여러 곳에 복사하는 부담을 줄인다.
한계는 올바른 메타데이터가 설치되어 있고 검색 경로가 맞아야 한다는 점이다. 실행용 공유 라이브러리만 설치하고 개발 헤더·.pc 파일은 빠져 있으면 조회나 컴파일이 실패한다. pkg-config 명령이 성공해도 필요한 함수가 실제 링크되거나 실행 환경에 모든 라이브러리가 있다는 사실까지 보장하지는 않는다.
가상 표지 검사 도구의 준비 확인
pkg-config, C 컴파일러와 libpng 개발 패키지가 준비된 환경을 가정한다. 아래 cover-info.c는 PNG 파일을 변환하는 대신 연결한 libpng 버전을 출력하는 작은 준비 확인 프로그램이다. 먼저 라이브러리 메타데이터를 읽고 필요한 플래그를 얻는다.
pkg-config --modversion libpng
pkg-config --cflags --libs libpng#include <stdio.h>
#include <png.h>
int main(void) {
printf("PNG helper library: %s\n", png_get_libpng_ver(NULL));
return 0;
}cc $(pkg-config --cflags libpng) cover-info.c -o cover-info $(pkg-config --libs libpng)
./cover-info컴파일 명령에서 헤더 옵션과 링크 옵션을 pkg-config가 제공한다. 실행하면 연결한 libpng의 버전 문자열이 나타나도록 작성했다. 버전 숫자는 설치 환경에 따라 달라진다. 라이브러리 이름은 배포판에 설치된 .pc 파일 이름을 기준으로 확인해야 한다.
동적·정적 링크와 교차 컴파일
정적 링크는 라이브러리 내부에서 필요한 추가 의존성까지 요구할 수 있다. --static은 관련 메타데이터를 더 포함해 주지만 그 옵션만으로 최종 프로그램이 자동으로 완전 정적 실행 파일이 되는 것은 아니다. 컴파일러와 링커 옵션, 정적 라이브러리 파일의 존재를 함께 확인한다.
기본 위치 밖에 설치한 .pc 파일은 PKG_CONFIG_PATH 등 검색 설정에 반영할 수 있다. 그러나 경로를 무작정 추가하면 의도하지 않은 버전이나 호스트용 라이브러리를 선택할 수 있다. 교차 컴파일에서는 실행 대상의 sysroot와 메타데이터를 구분한다. “라이브러리를 찾을 수 없음”을 모든 시스템 경로를 섞는 방식으로 해결하기보다 선택된 .pc 파일과 출력 플래그를 먼저 살피는 것이 낫다.
참고 자료
웹·서버 애플리케이션 개발 도구 지도 | |
|---|---|
JavaScript 실행과 빌드 | |
화면 스타일 | |
Rust 개발과 비동기 | Rust (프로그래밍 언어) · Cargo · Tokio · Axum |
Rust 데이터 접근 | |
Java 서버 개발 | |
네이티브 빌드 | |
이미지·영상 처리 | |