当前位置: 首页 > backend >正文

pkg-config 是什么,如何工作的

pkg-config 是一个在编译 C/C++ 等程序时用于 查询库的信息 的工具,它帮助开发者获取:

  • 库的编译器参数(如头文件的路径)
  • 链接器参数(如链接哪个 .so.a 文件)
  • 版本号等元信息

它的作用是 简化构建过程中的依赖管理


一、pkg-config 是干什么的?

比如你要用 glib-2.0 这个库,传统做法是:

gcc -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lglib-2.0 mycode.c -o myapp

但路径可能因系统不同而不同,非常不方便。

pkg-config 之后,你只需:

gcc mycode.c $(pkg-config --cflags --libs glib-2.0) -o myapp

这样系统就自动为你填入了正确的 -I-l 参数。


二、pkg-config 如何工作?

它基于 .pc 文件(package config 文件),这些文件一般位于:

  • /usr/lib/pkgconfig/
  • /usr/lib/x86_64-linux-gnu/pkgconfig/
  • /usr/local/lib/pkgconfig/
  • /usr/local/lib64/pkgconfig/
  • 环境变量指定的路径中(如 PKG_CONFIG_PATH

一个 .pc 文件示例如下(glib-2.0.pc):

prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/includeName: GLib
Description: C Utility Library
Version: 2.56.4
Libs: -L${libdir} -lglib-2.0
Cflags: -I${includedir}/glib-2.0 -I${libdir}/glib-2.0/include

当你运行:

pkg-config --cflags glib-2.0

它会解析 Cflags: 这一行,返回:

-I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include

而:

pkg-config --libs glib-2.0

会返回:

-L/usr/lib -lglib-2.0

三、常用命令

pkg-config --cflags <lib>       # 获取编译参数
pkg-config --libs <lib>         # 获取链接参数
pkg-config --modversion <lib>   # 获取库的版本
pkg-config --list-all           # 列出所有已知的库

四、注意事项

  • .pc 文件通常由库的开发者或包管理器提供;

  • 有些库不会默认安装 .pc 文件(多数会安装,可以在 install 日志中搜索 .pc 找到);

  • 如果刚安装的库执行 pkg-config --list-all 没有列出来,需要确认下 安装目录是否在 PKG_CONFIG_PATH 中包含,没有的话加上就行了

  • 交叉编译或自定义安装路径时需设置 PKG_CONFIG_PATH 环境变量:

    export PKG_CONFIG_PATH=/custom/lib/pkgconfig
    

http://www.xdnf.cn/news/7455.html

相关文章:

  • 深入解析`lsof`命令:查看系统中打开文件与进程信息
  • 【Nuxt3】安装 Naive UI 按需自动引入组件
  • ThreadLocal 源码深度解析
  • Linux基础第四天
  • goldenDB创建函数索引报错问题
  • 鸿蒙 Background Tasks Kit(后台任务开发服务)
  • 北京本地 SEO 推广:从技术成本到效果转化的深度拆解
  • 从零训练一个大模型:DeepSeek 的技术路线与实践
  • 苏州SMT贴片加工服务选择指南
  • MCP详解
  • Python中的整型(int)和浮点数(float)
  • 哈希表和哈希函数
  • 养生攻略:打造活力健康日常
  • 《 二级指针:解锁指针的进阶魔法》
  • GPT/Claude3国内免费镜像站更新 亲测可用
  • 活学妙用——5W2H分析法
  • 【java第17集】java流程控制语句详解
  • 按键太频繁导致,报不应该报的错误!
  • 秒删node_modules 极速删除 (rimraf工具)
  • Linux grep 命令详解:常用选项、参数及实战场景
  • 基于SpringBoot的家政预约系统
  • 以下是 MySQL 中常用到的 英语单词和词组 的全面分类整理,涵盖数据库操作、SQL语句、函数、配置等核心内容
  • 监控易:一体化集成平台,打破运维壁垒
  • 通过子接口(Sub-Interface)实现三层接口与二层 VLAN 接口的通信
  • bat 批处理获取日期、时间
  • vue3自适应高度超出折叠功能
  • 【DNS寻址之旅】从敲下网址到网页呈现:DNS的“第一次亲密接触”**
  • 聊聊更新中断和更新事件那些事儿
  • 【C++】不推荐使用的std::allocator<void>
  • 对于程序员的个人理解