[工程构建] 使用pkg-config协助工程搭建

前言:

在进行工程构建的时候,往往需要指定头文件搜索路径,库文件路径,库文件名等等一系列编译链接需要的参数。我们可以记住这些路径和名称,但是如果这些值有变更,那么就需要手动修改makefile或者cmake文件以进行调整。

此外,我们可以通过pkg-config工具来协助完成这些路径和名称的动态查找,那么makefile里和cmake文件里的值就是动态的了。

pkg-config是一个可执行命令行工具,具体的用法见

pkg-config -h

如何使用pkg-config

查看头文件选项

pkg-config --cflags gstreamer-1.0

bash 复制代码
-pthread -I/usr/include/gstreamer-1.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include

查看链接选项

pkg-config --libs gstreamer-1.0

bash 复制代码
-lgstreamer-1.0 -lgobject-2.0 -lglib-2.0

什么是 .pc 文件

上面提到的 --cflags 和 --libs 选项是如何获得结果中的信息呢?其实,pkg-config 工作的原理是每个库都要提供自己的 .pc文件,这个文件里描述了在使用这个库时需要用到的链接选项是什么,头文件路径又在哪里。

比如 /usr/lib/x86_64-linux-gnu/pkgconfig/gstreamer-1.0.pc

bash 复制代码
prefix=/usr
exec_prefix=${prefix}
libdir=${prefix}/lib/x86_64-linux-gnu
includedir=${prefix}/include/gstreamer-1.0
toolsdir=${exec_prefix}/bin
pluginsdir=${prefix}/lib/x86_64-linux-gnu/gstreamer-1.0
datarootdir=${prefix}/share
datadir=${datarootdir}
girdir=${datadir}/gir-1.0
typelibdir=${libdir}/girepository-1.0

Name: GStreamer
Description: Streaming media framework
Version: 1.16.3
Requires: glib-2.0, gobject-2.0
Requires.private: gmodule-no-export-2.0
Libs: -L${libdir} -lgstreamer-1.0
Cflags: -I${includedir}

到哪里去找 .pc 文件

pkg-config默认情况下会去 PKG_CONFIG_PATH 环境变量指定的路径下查找 .pc 文件,如果这个环境变量没设置,那么它会从某些系统路径中搜索,为了能够罗列这些路径,可以通过如下命令:

pkg-config --variable pc_path pkg-config

bash 复制代码
/usr/local/lib/x86_64-linux-gnu/pkgconfig:/usr/local/lib/pkgconfig:/usr/local/share/pkgconfig:/usr/lib/x86_64-linux-gnu/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig

把冒号换成回车,就有:

/usr/local/lib/x86_64-linux-gnu/pkgconfig
/usr/local/lib/pkgconfig
/usr/local/share/pkgconfig
/usr/lib/x86_64-linux-gnu/pkgconfig
/usr/lib/pkgconfig:/usr/share/pkgconfig

编译时使用pkg-config自动添加头文件搜索路径

pkg-config 的 --cflags 选项是编译选项,因此所有编译相关的信息都可以通过这个选项获取,比如罗列某个库的头文件搜索路径:

bash 复制代码
gcc -c `pkg-config --cflags glib-2.0` sample.c

链接时使用pkg-config自动添加链接路径和链接库的名字

pkg-config 的 --libs 选项时链接选项,因此所有链接相关的信息都可以通过这个选项获取,比如罗列某个库的库所在路径(-L)并指定链接库名字(-l):

bash 复制代码
gcc sample.o -o sample `pkg-config --libs glib-2.0`

编译链接合并使用

此外,我们也可以把 cflags 和 libs 合并使用:

bash 复制代码
gcc sample.c -o sample `pkg-config --cflags --libs glib-2.0`
相关推荐
lajidecrd1 分钟前
Ubuntu 24.04 LTS安装
linux·运维·ubuntu
ai小陈1 分钟前
PyTorch多GPU分布式训练实战:从单卡脚本迁移到DDP
服务器·人工智能·pytorch·分布式·深度学习·ai·gpu算力
沫璃染墨9 分钟前
《从零入门Linux系统篇(二十九):文件篇·二——深入文件描述符:从文件描述符表到重定向,再到Shell实现》
linux·运维·服务器·c++·驱动开发·系统架构
jing.wang_202521 分钟前
制作最小Linux(Ubuntu)系统
linux·嵌入式硬件·ubuntu·dsp开发
陈年老古董22 分钟前
Shell 脚本编程基础完整学习笔记
linux·sql·mysql
竣达技术29 分钟前
守护变电站直流 “生命线”|竣达 BMS‑PRO‑II 智能电池综合管理单元,让蓄电池运维看得见、管得牢
运维·监控系统·机房监控
byte轻骑兵39 分钟前
【BlueZ 】蓝牙地址与 UUID:BlueZ 源码中核心标识的定义与使用
linux·bluez·电脑蓝牙·嵌入式蓝牙
云上工程笔记41 分钟前
2026 年 GPU 云服务器成本对比榜单:显存、算力、单小时价格和任务完成成本怎么算
运维·服务器
楠楠子呀42 分钟前
号码验证技术解析:从原理到实践
运维·人工智能·ai·electron·自动化
Baron X1 小时前
Linux PAM登录告警
linux·运维·告警