Search Suggest

Pkg-config

Bài viết liên quan:
+ Cross compiling the libraries

pkg-config là một chương trình build-in sẵn trong linux, có chức năng lấy thông tin về một thư viện nào đó đã được installed để phục vụ cho việc build một ứng dụng hoặc một thư viện khác có sử dụng thư viện này.
Thư viện đã installed sẽ có các file có đuôi mở rộng ".pc" chứa các thông tin về thư viện, chương trình pkg-config sẽ đọc thông tin từ các file này ra thông qua một biến môi trường có tên là PKG_CONFIG_PATH.
Theo như ví dụ như trong bài viết Cross compiling the libraries chúng ta đã build xong thư viện taglib-1.6.3


taglib.pc
 prefix=/home/ninhld/Documents/taglib_install  
exec_prefix=${prefix}
libdir=${exec_prefix}/lib64
includedir=${prefix}/include

Name: TagLib
Description: Audio meta-data library
Requires:
Version: 1.6.3
Libs: -L${libdir} -ltag
Cflags: -I${includedir}/taglib


taglib_c.pc
 prefix=/home/ninhld/Documents/taglib_install  
exec_prefix=${prefix}
libdir=${exec_prefix}/lib64
includedir=${prefix}/include

Name: TagLib C Bindings
Description: Audio meta-data library (C bindings)
Requires: taglib
Version: 1.6.3
Libs: -L${libdir} -ltag_c
Cflags: -I${includedir}/taglib



Các thông tin chính bao gồm:
+ Đường dẫn đến thư mục header, tương ứng với CFLAGS
+ Đường dẫn đến thư mục lib (chứa .la, .so), tương ứng với LDFLAGS


pkg-config hoạt động như thế nào:
+ Export biến môi trường PKG_CONFIG_PATH
+ Sử dụng lệnh pkg-config cùng với các options như --cflags, --libs, ...

 [ninhld@localhost examples]$   
[ninhld@localhost examples]$ export TAGLIBDIR=/home/ninhld/Documents/taglib_install
[ninhld@localhost examples]$ export PATH=$PATH:${TAGLIBDIR}/bin
[ninhld@localhost examples]$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${TAGLIBDIR}/lib64
[ninhld@localhost examples]$ export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:${TAGLIBDIR}/lib64/pkgconfig
[ninhld@localhost examples]$
[ninhld@localhost examples]$ pkg-config --cflags taglib taglib_c
-I/home/ninhld/Documents/taglib_install/include/taglib

[ninhld@localhost examples]$
[ninhld@localhost examples]$ pkg-config --libs taglib taglib_c
-L/home/ninhld/Documents/taglib_install/lib64 -ltag_c -ltag

[ninhld@localhost examples]$
[ninhld@localhost examples]$

Như vậy có thể thấy thay vì export các biến CFLAGS / LDFLAGS:
 export CFLAGS+="-I${TAGLIBDIR}/include/taglib -DDEBUG -Wall -g"    
export LDFLAGS+="-L${TAGLIBDIR}/lib64 -ltag_c -ltag"

thì bạn có thể dùng pkg-config:
 export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:${TAGLIBDIR}/lib64/pkgconfig  
pkg-config --libs --cflags taglib taglib_c

Note: taglib / taglib_c tương ứng với taglib.pc / taglib_c.pc

Cuối cùng, cũng với ví dụ taglreader_c.c như trong bài  Cross compiling the libraries, hai cách dưới đây là tương đương:

 gcc -o tagreader tagreader_c.c ${CFLAGS} ${LDFLAGS}  

 gcc -o tagreader tagreader_c.c $(pkg-config --libs --cflags taglib taglib_c)  

Note: pkg-config rất hữu ích khi có rất nhiều thư viện được installed ở các thư mục khác nhau, thay vì phải liệt kê tất cả các đường dẫn và lib trong CFLAGS / LDFLAGS thì chỉ cần export PKG_CONFIG_PATH đến các thư mục pkgconfig của các thư viện installed là đủ.

Đăng nhận xét