簡介
現在的電腦系統使用許多library package供使用者使用,但是在不同的platform使用這些library package是一件很困難的事,pkg-config收集相關的資訊並且統一的API供開發人員使用。 pkg-config利用".pc"檔的格式,記錄了一些library相關的資訊,提供對應的information給開發人員使用,以ubuntu為例,這些檔案被放置在/usr/lib/x86_64-linux-gnu/pkgconfig、/usr/lib/i386-linux-gnu/pkgconfig與/usr/lib/pkgconfig等目錄,以下為directfb的.pcbrook@vista:~$ cat /usr/lib/x86_64-linux-gnu/pkgconfig/directfb.pc prefix=/usr exec_prefix=${prefix} libdir=${prefix}/lib/x86_64-linux-gnu includedir=${prefix}/include Name: DirectFB Description: Graphics and windowing library for the Linux frame buffer device Version: 1.2.10 Requires: fusion direct Libs: -L${libdir} -ldirectfb -lpthread Libs.private: -L${libdir} -ldl Cflags: -D_REENTRANT -I${prefix}/include/directfb brook@vista:~$ pkg-config --list-all file_name_of_library_or_package Name_in_pc - Description_in_pc ... direct Direct - DirectFB base development library ...
PC檔內容
.pc包含了事先定義好的variable(key=value)與description(Name: description),description有以下資訊Name: library的name。 Description: library的簡述。 URL: library的相關URL。 Version: library的版號資訊。 Requires: library所需要的library,可能會包含所需的版號資訊(=, <, >, <= or >=)。 Requires.private: 與 Requires相似,用於static link。 Conflicts: library可能與某個library衝突的資訊,可能會包含衝突的版號資訊(=, <, >, <= or >=)。 Cflags: 使用該library所需的compiler flags。 Libs: 使用該library所需的link flags。 Libs.private: 與Libs相似,用於static link。
pkg-config操作
基本語法為pkg-config [input parameters] [LIBRARIES...]相關input參數可以參考man pagebrook@vista:~$ pkg-config --modversion --print-errors directfb 1.2.10 brook@vista:~$ pkg-config --cflags --print-errors directfb -D_REENTRANT -I/usr/include/directfb brook@vista:~$ pkg-config --libs --print-errors directfb -ldirectfb -lpthread -lfusion -ldirect -lpthread brook@vista:~$ pkg-config --libs --static --print-errors directfb -ldirectfb -lpthread -ldl -lfusion -ldirect -lpthread -ldl brook@vista:~$ pkg-config --print-requires --print-errors directfb fusion direct brook@vista:~$ pkg-config --print-requires --print-errors "directfb > 1.3" Requested 'directfb > 1.3' but version of DirectFB is 1.2.10 brook@vista:~$ pkg-config --exists --print-errors directfb brook@vista:~$ echo $? 0 brook@vista:~$ pkg-config --exists --print-errors directfbxx Package directfbxx was not found in the pkg-config search path. Perhaps you should add the directory containing `directfbxx.pc' to the PKG_CONFIG_PATH environment variable No package 'directfbxx' found brook@vista:~$ echo $? 1
pkg-config實際應用
With GCCbrook@vista:~$ pkg-config --cflags --libs directfb -D_REENTRANT -I/usr/include/directfb -ldirectfb -lpthread -lfusion -ldirect -lpthread brook@vista:~$ gcc `pkg-config --cflags --libs directfb` -o myapp myapp.c
With autoconf and automake
configure.ac: PKG_CHECK_MODULES([DIRECTFB], [directfb]) Makefile.am: myapp_CFLAGS = $(DIRECTFB_CFLAGS) myapp_LDADD = $(DIRECTFB_LIBS)
- 參考資料:
- 簡介 pkg-config 的功能與用法, http://yczhuang.blogspot.tw/2007/04/pkg-config.html
- Guide to pkg-config, https://people.freedesktop.org/~dbn/pkg-config-guide.html#writing
- pkg-config 使用及建立方法, http://jyhshin.pixnet.net/blog/post/26588033-pkg-config-%E4%BD%BF%E7%94%A8%E5%8F%8A%E5%BB%BA%E7%AB%8B%E6%96%B9%E6%B3%95