编译连接技巧-使用pkg-config配置选项

pkg-config是一个linux下的命令,用于获得某一个库/模块的所有编译相关的信息。

如果要使用第三方的头文件和库文件,在编译、链接的时候,必须要指定这些头文件和库文件的位置。
对于一个比较大第三方库,其头文件和库文件的数量是比较多的。如果我们一个个手动地写,那将是相当麻烦的。
所以,pkg-config就应运而生了。pkg-config能够把这些头文件和库文件的位置指出来,给编译器使用。

pkg-config命令是通过查询XXX.pc文件获得某一个库/模块的所有编译相关的信息的。
但pkg-config是如何查找对应的.pc文件呢?环境变量PKG_CONFIG_PATH写明.pc文件的路径,pkg-config命令会读取这个环境变量的内容,然后去查找pc文件。

$ pkg-config --cflags gtk+-3.0
-pthread -I/usr/include/gtk-3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/include/gio-unix-2.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/fribidi -I/usr/include/harfbuzz -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/uuid -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include
$ pkg-config --libs gtk+-3.0
-lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0

pc文件的所有参数:

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

其实必要的只有5个:Name、Description、Version、Cflags、Libs。

如lib/pkgconfig/libdrm.pc的内容如下

prefix=/home/user/wayland-study/libdrm/buildout                                                               
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: libdrm
Description: Userspace interface to kernel DRM services
Version: 2.4.98
Libs: -L${libdir} -ldrm
Cflags: -I${includedir} -I${includedir}/libdrm

注意pc文件的关键在于后面的 Name,Version,Libs,Cflags的定义,
以便pkg-config命令进行对应的查询和输出;

~/wayland-study/libdrm/buildout$ export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:$(pwd)/lib/pkgconfig
~/wayland-study/libdrm/buildout$ pkg-config --cflags libdrm
-I/home/user/wayland-study/libdrm/buildout/include -I/home/user/wayland-study/libdrm/buildout/include/libdrm
~/wayland-study/libdrm/buildout$ pkg-config --libs libdrm
-L/home/user/wayland-study/libdrm/buildout/lib -ldrm

在Makefile上可以直接追加到环境变量中,如

CFLAGS += `pkg-config --cflags libdrm`
LDFLAGS += `shell pkg-config --libs libdrm`

注意其中的反引号`对应的是~按键对应的字符

CFLAGS += $(shell pkg-config --cflags libdrm)
LDFLAGS += $(shell pkg-config --libs libdrm)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个警告提示缺少 aarch64-linux-gnu-pkg-config 工具,这可能会导致某些库的检测失败。pkg-config 是一个用于管理编译时依赖库信息的工具,它可以帮助编译器定位和链接所需的库文件。 为了解决这个问题,你可以尝试以下方法: 1. 安装 aarch64-linux-gnu-pkg-config 工具 你可以通过命令行安装 aarch64-linux-gnu-pkg-config 工具,例如: ``` sudo apt-get install pkg-config-aarch64-linux-gnu ``` 这将安装适用于 arm64 架构的 pkg-config 工具,并将其命名为 aarch64-linux-gnu-pkg-config。 2. 手动指定 pkg-config 路径 如果无法安装 aarch64-linux-gnu-pkg-config 工具,你可以手动指定 pkg-config 路径。在编译 FFmpeg 时,使用 PKG_CONFIG_PATH 环境变量来指定 pkg-config 的搜索路径,例如: ``` export PKG_CONFIG_PATH=/usr/local/arm64/lib/pkgconfig ``` 这将告诉编译器在 /usr/local/arm64/lib/pkgconfig 目录下搜索 pkg-config 配置文件,以便正确定位和链接库文件。 3. 确认库文件是否正确安装 如果以上方法仍然无法解决问题,你可以确认所需的库文件是否正确安装,并且在系统和环境变量中正确配置了库文件搜索路径。你可以尝试使用 ldconfig -p 命令来列出当前系统中可用的共享库文件和路径。 总之,pkg-config编译过程中需要的一个重要工具,缺少它可能会导致编译错误或运行时错误。你需要确保已正确安装所需的工具和库文件,并在编译选项中正确指定和配置它们。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值