当前位置: 首页 > 工具软件 > Pkg > 使用案例 >

pkg-config使用笔记

广瑞
2023-12-01

简介

pkg-config用于返回系统中已安装库的元信息。pkg-config对库元信息查询是通过在指定目录中去查询xxx.pc文件,从xxx.pc文件中解析得到库对元信息。

pkg-config搜索路径

  1. 默认路径: 通过命令"pkg-config --variable pc_path pkg-config"获取。
xxx:~$ pkg-config --variable pc_path pkg-config
/usr/lib64/pkgconfig:/usr/share/pkgconfig
xxx:~$ 
  1. 自定义路径:通过环境变量PKG_CONFIG_PATH设置。
xxx:~$ echo $PKG_CONFIG_PATH

xxx:~$ export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
xxx:~$ echo $PKG_CONFIG_PATH
/usr/local/lib/pkgconfig
xxx:~$ export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:${PKG_CONFIG_PATH}
xxx:~$ echo $PKG_CONFIG_PATH
/usr/local/lib64/pkgconfig:/usr/local/lib/pkgconfig

pkg-config查看库的安装信息

pkg-config帮助信息

xxx:~$ pkg-config -h
Usage:
  pkg-config [OPTION?]

Help Options:
  -h, --help                              Show help options

Application Options:
  --version                               output version of pkg-config
  --modversion                            output version for package
  --atleast-pkgconfig-version=VERSION     require given version of pkg-config
  --libs                                  output all linker flags
  --static                                output linker flags for static linking
  --short-errors                          print short errors
  --libs-only-l                           output -l flags
  --libs-only-other                       output other libs (e.g. -pthread)
  --libs-only-L                           output -L flags
  --cflags                                output all pre-processor and compiler flags
  --cflags-only-I                         output -I flags
  --cflags-only-other                     output cflags not covered by the cflags-only-I option
  --variable=NAME                         get the value of variable named NAME
  --define-variable=NAME=VALUE            set variable NAME to VALUE
  --exists                                return 0 if the module(s) exist
  --print-variables                       output list of variables defined by the module
  --uninstalled                           return 0 if the uninstalled version of one or more module(s) or their dependencies will be used
  --atleast-version=VERSION               return 0 if the module is at least version VERSION
  --exact-version=VERSION                 return 0 if the module is at exactly version VERSION
  --max-version=VERSION                   return 0 if the module is at no newer than version VERSION
  --list-all                              list all known packages
  --debug                                 show verbose debug information
  --print-errors                          show verbose information about missing or conflicting packages,default if --cflags or --libs given on the command line
  --silence-errors                        be silent about errors (default unless --cflags or --libsgiven on the command line)
  --errors-to-stdout                      print errors from --print-errors to stdout not stderr
  --print-provides                        print which packages the package provides
  --print-requires                        print which packages the package requires
  --print-requires-private                print which packages the package requires for static linking

xxx:~$ 

查看所有的库

xxx:~$ pkg-config --list-all
sqlite3                             SQLite - SQL database engine
xcb-xevie                           XCB Xevie - XCB Xevie Extension
xcb-damage                          XCB Damage - XCB Damage Extension
blkid                               blkid - Block device id library
pixman-1                            Pixman - The pixman library (version 1)

......

libedata-book-1.2                   libedatabook - Backend library for evolution address books
renderproto                         RenderProto - Render extension headers
xxx:~$

下面我们以libssl为例讲解其部分选项的使用方式。
libssl.pc内容

xxx:~$ cat /usr/lib64/pkgconfig/libssl.pc 
prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib64
includedir=${prefix}/include

Name: OpenSSL
Description: Secure Sockets Layer and cryptography libraries
Version: 1.0.1e
Requires: 
Libs: -L${libdir} -lssl -lcrypto
Libs.private: -Wl,-z,relro -ldl -lz -L/usr/lib -lgssapi_krb5 -lkrb5 -lcom_err -lk5crypto
Cflags: -I${includedir} -I/usr/include
xxx:~$ 
  1. 查看libss库的版本
[xxx:~$ pkg-config --modversion libssl
1.0.1v-dev
xxx:~$ 
  1. 查看libssl链接方式
xxx:~$ pkg-config --libs-only-l libssl
-lssl -lcrypto  
xxx:~$ 
  1. 查看libssl链接目录
xxx:~$ pkg-config --libs-only-L libssl
 
xxx:~$
  1. 查看libssl是否存在
xxx:~$ pkg-config --exists libssl
xxx:~$ echo $?
0
xxx:~$ pkg-config --exists libssl2
xxx:~$ echo $?
1
xxx:~$ 

libssl是存在的,所以执行后的返回错误码为0;libssl2是不存在的,所以执行后返回错误码为1。
在configure文件中的应用

xxx:~$ pkg-config --exists --print-errors libssl
xxx:~$ echo $?
0
xxx:~$ pkg-config --exists --print-errors libssl2
Package libssl2 was not found in the pkg-config search path.
Perhaps you should add the directory containing `libssl2.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libssl2' found
xxx:~$ echo $?
1
xxx:~$ 

自定义配置xxx.pc文件

想要自定义配置一个xxx.pc文件,需要先弄明白都有那些配置项可以配置,以及配置格式。
特别说明:pkg-config管理的文件必须是以“*.pc”的后缀名结尾。
配置格式形如:

xxx:~$ cat /usr/lib64/pkgconfig/libssl.pc 
prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib64
includedir=${prefix}/include

Name: OpenSSL
Description: Secure Sockets Layer and cryptography libraries
Version: 1.0.1e
Requires: 
Libs: -L${libdir} -lssl -lcrypto
Libs.private: -Wl,-z,relro -ldl -lz -L/usr/lib -lgssapi_krb5 -lkrb5 -lcom_err -lk5crypto
Cflags: -I${includedir} -I/usr/include
xxx:~$ 

配置项说明

  1. Name: 该模块的名字,比如你的pc名字是xxxx.pc,那么名字最好也是xxxx。
  2. Description: 模块的简单描述。上文pkg-config –list-all命令出来的结果,每个名字后面就是description。
  3. URL: 用户可以通过该URL获得更多信息,或者下载信息。也是辅助的,可要可不要。
  4. Version: 版本号。
  5. Requires: 该模块有木有依赖于其他模块。一般没有。
  6. Requires.private: 该模块有木有依赖于其他模块,并且还不需要第三方知道的。一般也没有。
  7. Conflicts: 有没有和别的模块冲突。常用于版本冲突。比如,Conflicts: bar < 1.2.3,表示和bar模块的1.2.3以下的版本有冲突。
  8. Cflags: 这个就很重要了。pkg-config的参数–cflags就指向这里。主要用于写本模块的头文件的路径。
  9. Libs: 也很重要,pkg-config的参数–libs就指向这里。主要用于写本模块的库/依赖库的路径。
  10. Libs.private: 本模块依赖的库,但不需要第三方知道。

其实必须写的只有5个。Name、Description、Version、Cflags、Libs。

 类似资料: