우선 pkg-config가 무엇을 할 수 있는지 알아보겠습니다. pkg-config에 대한 Wikipedia의 설명은 다음과 같습니다.
pkg-config는 소스 코드에서 소프트웨어를 컴파일할 때 설치된 라이브러리를 쿼리하기 위한 통합 인터페이스를 제공하는 컴퓨터 소프트웨어입니다. pkg-config는 원래 Linux용으로 설계되었지만 현재는 다양한 버전의 BSD, Windows, Mac OS X 및 Solaris에서 사용할 수 있는 버전이 있습니다.
간단히 말하면 pkg-config는 주로 다음과 같은 기능을 제공합니다.
1. 라이브러리의 버전을 확인합니다. 필요한 라이브러리 버전이 요구 사항을 충족하지 않는 경우 잘못된 버전의 라이브러리 파일이 연결되는 것을 방지하기 위해 오류 메시지가 인쇄됩니다.
2. 매크로 정의, 헤더 파일 위치 등 컴파일 전처리 매개변수를 얻습니다.
3. 라이브러리 및 기타 종속 라이브러리의 위치, 파일 이름, 기타 연결 매개변수와 같은 링크 매개변수를 얻습니다.
4. 의존하는 다른 라이브러리에 대한 설정을 자동으로 추가합니다.
최근 opencv를 사용하여 이미지 자르기를 위한 PHP 확장을 개발했습니다. Opencv는 많은 so 라이브러리를 로드해야 합니다. config.m4에 수동으로 추가하는 것은 너무 번거롭고 사후 유지 관리를 활용하지 않습니다. 다행히 opencv는 opencv.pc 파일을 제공하므로 pkg-config를 사용하여 컴파일된 매개변수를 자동으로 얻을 수 있습니다.
다음은 opencv 관련 so 라이브러리와 헤더 파일을 자동으로 불러오기 위해 config.m4에 작성한 코드입니다.
dnl # --with-tclip -> check with-path SEARCH_PATH="/usr/lib/pkgconfig" # 定义pkgconfig文件,即扩展名pc文件存放路径 SEARCH_FOR="opencv.pc" # 要寻找的文件 if test -r $PHP_TCLIP/$SEARCH_FOR; then # TCLIP_DIR=$PHP_TCLIP else # search default path list AC_MSG_CHECKING([for tclip files in default path]) for i in $SEARCH_PATH ; do if test -r $i/$SEARCH_FOR; then TCLIP_DIR=$i AC_MSG_RESULT(found in $i) fi done fi dnl if test -z "$TCLIP_DIR"; then AC_MSG_RESULT([not found]) AC_MSG_ERROR([Please reinstall the tclip distribution]) fi OPENCV_FLAGS="`pkg-config opencv --libs --cflags opencv`" for i in $OPENCV_FLAGS;do if test ${i:0:2} = "-I" ;then PHP_ADD_INCLUDE(${i:2}) elif test ${i:${#i}-3} = ".so" ;then dir_name=`dirname $i` file_name=${i/$dir_name/} file_name=${file_name/\/lib/} file_name=${file_name/.so/} PHP_ADD_LIBRARY_WITH_PATH($file_name,$dir_name,TCLIP_SHARED_LIBADD) fi done
참고:
if의 조건 부분에 중괄호를 사용하지 마십시오. 그렇지 않으면 m4에서 생성된 makefile에 구문 오류가 발생합니다.
참고문서
http://www.chenjunlu.com/2011/03/understanding-pkg-config-tool/ "pkg-config 도구 이해"
http://www.php .net/manual/zh/internals2.buildsys.configunix.php "UNIX 빌드 시스템과 상호작용: config.m4"