pkg-config pc 파일을 찾으며 정리한 생각

Cute_Security15·2024년 10월 3일
0

linux dev

목록 보기
7/9

상황

opencv 어플리케이션을 빌드가 필요한 상황이고,
빌드 스크립트 내에선 pkg-config 를 사용하고 있다.

g++ pablo_uvc_uart_server.cpp pablo_uvc_uart_command.cpp pablo_uvc_opencv_control.cpp \ 
-o uart_server -lpthread `pkg-config --cflags --libs opencv4`

opencv 라이브러리가 설치되어 있지 않으므로 빌드가 실패한다.
opencv4.pc 파일이라는 걸 찾아야 하는듯 하다.

root@user-virtual-machine:/home/user/pablo_uart_code# make
g++ pablo_uvc_uart_server.cpp pablo_uvc_uart_command.cpp pablo_uvc_opencv_control.c  pp -o uart_server -lpthread `pkg-config --cflags --libs opencv4`

Package opencv4 was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv4.pc'
to the PKG_CONFIG_PATH environment variable
No package 'opencv4' found

pablo_uvc_opencv_control.cpp:5:10: fatal error: opencv2/opencv.hpp: No such file or   directory
    5 | #include <opencv2/opencv.hpp>
      |          ^~~~~~~~~~~~~~~~~~~~
compilation terminated.
make: *** [Makefile:4: pablo_uvc_uart_server] Error 1

root@user-virtual-machine:/home/user/pablo_uart_code# 

pkg-config 의 컨셉과 opencv 빌드구성에 필요한 생각을 만들고, 정보를 정리한다.

pkg-config

라이브러리를 사용해서 바이너리를 빌드할때,
pkg-config 를 사용해서, 빌드에 필요한 cflags 와 링커옵션들 (libs) 을 받아오는 경우가 있다.

이때 pkg-config 는 정해진 search path 내에 있는 .pc 파일에서 정보를 확인한다고 한다.
그 중 하나가 /usr/lib/pkg-config/ 이다.

  • search path 의 본래 이름은 pc_path 변수로, pkg-config 에서 query 를 통해
    확인할수 있다. (아래에서 다룸)
  • pc_path 를 무시하고 싶다면, 환경변수 PKG_CONFIG_PATH 를 사용해 직접 지정할수도 있다.
### man pkg-config

ENVIRONMENT VARIABLES
       PKG_CONFIG_PATH
              A colon-separated (on  Windows,  semicolon-separated)  list  of  directories  to
              search  for  .pc  files.   The  default  directory will always be searched after
              searching the path; the default is libdir/pkgconfig:datadir/pkgconfig where lib‐
              dir  is the libdir for pkg-config and datadir is the datadir for pkg-config when
              it was installed.

확인해보았으나, opencv pc 파일은 확인되지 않는다.

root@user-virtual-machine:/usr/lib/pkgconfig# ls
aspnetwebstack.pc  mono-2.pc           monosgen-2.pc                        system.web.mvc3.pc
cecil.pc           mono-cairo.pc       nunit.pc                             system.web.mvc.pc
dotnet35.pc        mono-lineeditor.pc  reactive.pc                          wcf.pc
dotnet.pc          mono-nunit.pc       system.web.extensions_1.0.pc         xbuild12.pc
ibus-table.pc      mono-options.pc     system.web.extensions.design_1.0.pc
libgdiplus.pc      mono.pc             system.web.mvc2.pc
root@user-virtual-machine:/usr/lib/pkgconfig#
root@user-virtual-machine:/usr/lib/pkgconfig# find . -name "opencv*"
root@user-virtual-machine:/usr/lib/pkgconfig#

그럼 먼저 opencv2/opencv.hpp 헤더를 제공하는 패키지 부터 설치해본다.

root@user-virtual-machine:/home/user/pablo_uart_code# apt-file search opencv2/opencv.hpp
libopencv-core-dev: /usr/include/opencv4/opencv2/opencv.hpp
root@user-virtual-machine:/home/user/pablo_uart_code# apt-get install libopencv-core-dev

이후 다시 빌드를 해보았으나, 빌드시 pkg-config 는 opencv 정보를 확인하지 못했다.

.pc 파일 검색

혹시나 해서 좀더 검색해보니, .pc 파일도 검색을 할수 있다는 정보를 획득했다.
https://stackoverflow.com/a/21524027/20746475

--> libopencv-dev 를 설치해야 한다는 걸 알았다.

root@user-virtual-machine:/home/user/pablo_uart_code# apt-file search opencv4.pc
libopencv-dev: /usr/lib/x86_64-linux-gnu/pkgconfig/opencv4.pc
root@user-virtual-machine:/home/user/pablo_uart_code#
root@user-virtual-machine:/home/user/pablo_uart_code# apt-get install libopencv-dev

설치 후 확인해보니 .pc 파일이 내가 예상했던 곳 (/usr/lib/pkg-config) 이 아니라
/usr/lib/x86_64-linux-gnu/pkgconfig/opencv4.pc 에 위치해 있었다.

root@user-virtual-machine:/usr/lib# find . -name "opencv*"
./x86_64-linux-gnu/cmake/opencv4
./x86_64-linux-gnu/pkgconfig/opencv4.pc
root@user-virtual-machine:/usr/lib#

pkg-config 가 현재 사용중인 pc_path 조회

chatgpt 에게 물어보니, pkg-config 가 .pc 파일 검색에 사용하는 pc_path 를
확인하는 명령은 아래와 같다고 한다.

root@user-virtual-machine:/usr/lib# pkg-config --variable pc_path pkg-config
/usr/local/lib/x86_64-linux-gnu/pkgconfig:/usr/local/lib/pkgconfig:/usr/local/share/pkgconfig:/usr/lib/x86_64-linux-gnu/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig
root@user-virtual-machine:/usr/lib#

내가 본 경로 (/usr/lib/x86_64-linux-gnu/pkgconfig) 외에도 여러 경로가 쓰이고 있는걸
직접 확인할수 있었다.

빌드성공 확인

root@user-virtual-machine:/home/user/pablo_uart_code# make
g++ pablo_uvc_uart_server.cpp pablo_uvc_uart_command.cpp pablo_uvc_opencv_control.cpp -o uart_server -lpthread `pkg-config --cflags --libs opencv4`
root@user-virtual-machine:/home/user/pablo_uart_code#
profile
관심분야 : Filesystem, Data structure, user/kernel IPC

2개의 댓글

comment-user-thumbnail
2024년 11월 4일

시스템 내 존재하는 모든 package 들 리스트업 명령
pkg-config --list-all

답글 달기