Friday, July 3, 2015

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à đủ.

Leave a Reply

Subscribe to Posts | Subscribe to Comments

- Copyright © Lập trình hệ thống nhúng Linux . Powered by Luong Duy Ninh -