新手向-pkg-config的原理和使用

工作中遇到,发现自己不太了解,所以写篇博客学习&记录一下,不同意见欢迎评论区分享。


1. 简介

pkg-config是一个用于链接库的工具,可以简化编译的语句。

以编译需要opencv的代码为例:

bash 复制代码
# 不使用pkg-config
g++ -o opencv opencv.cpp  -L/usr/local/lib -lopencv_highgui -lopencv_ml -lopencv_objdetect -lopencv_photo -lopencv_stitching -lopencv_video -lopencv_calib3d -lopencv_features2d -lopencv_dnn -lopencv_flann -lopencv_videoio -lopencv_imgcodecs -lopencv_imgproc -lopencv_core

# 使用pkg-config
g++ -o opencv opencv.cpp `pkg-config --cflags --libs opencv4`  

pkg-config帮我们自动链接了opencv相关的库,省得我们自己写了。

2. 原理

pkg-config的原理是应用在装包时提供一个pc文件,存在在指定的目录。

这个pc文件里通常包含使用这个库需要的库路径,以及头文件路径等内容。

编译的时候pkg-config会自动到目录下寻找相应的pc文件,按找文件的内容链接头文件和库文件。

3. pc文件

用一个简单的示例来解释pc文件的内容:

bash 复制代码
# 文件名叫mylib.pc
prefix=/usr/local                # 安装的根路径,通常mylib的所有文件都在这个路径下
exec_prefix=${prefix}            # 专门用于存放可执行文件和相关资源的目录                               
includedir=${prefix}/include     # 头文件目录
libdir=${exec_prefix}/lib        # 库文件目录

# 开发者可以在 .pc 文件中定义任何变量,没有限制,举例的以上4个是较为常用的

Name: MyLibrary                  # 包的名称
Description: A sample library for demonstration # 包的描述
Version: 1.0.0                   # 包的版本
Requires: libxml-2.0 >= 2.4.0    # 依赖的包
Requires.private: zlib >= 1.2.8  # 私有依赖的包(静态链接需要的)
Conflicts: mylib-old <= 0.9      # 冲突的包
Cflags: -I${includedir}/mylib    # 编译标志(通常是头文件路径)
Libs: -L${libdir} -lmylib        # 链接标志(通常是库路径和库名)
Libs.private: -lm                # 私有链接标志(静态链接时需要)

这个文件需要放置在指定路径下才能生效,可以通过指令查询生效路径:

bash 复制代码
# 查询pkg-config的pc文件存放路径
pkg-config --variable=pc_path pkg-config

如果要在编译时使用此pc文件,编译语句应该为:

bash 复制代码
gcc -o demo demo.c `pkg-config --cflags --libs mylib` 
# 这里是pc文件名,不是文件里的包名
# --cflags --libs 表示使用文件里的Cflags变量和Libs变量
相关推荐
M78佐菲3 小时前
Linux学习笔记:TCP协议
linux·笔记·学习·tcp/ip·算法
Brilliantwxx3 小时前
【Linux】 进程(9)程序与进程地址空间(基础+进阶+面试题)
linux·运维·服务器·开发语言·c++
不怕犯错,就怕不做4 小时前
git prune 自动删除本地记录中那些远程已经不存在的分支引用
linux·服务器·git
一池秋_5 小时前
arm低配linux设备,桌面应用冷启动提速方法
linux·运维·arm开发
惜离殇5 小时前
从零开始的敲代码生活--Linux应用软件(文件操作基础1)
linux·c语言·文件操作·标准io
闲云野鹤在人间8 小时前
OpenStack架构介绍和安装流程
linux·网络·架构·openstack
我命由我123458 小时前
Linux - Linux/POSIX 路径斜杠折叠规则
linux·运维·服务器·android studio·android jetpack·android-studio·android runtime
xx~t9 小时前
嵌入式——Linux软件编程——网络1
linux·c语言·网络·vscode·网络协议
Uncertainty!!9 小时前
Linux 主机无法完成校园网认证排查记录:从 DHCP、ARP 到 Portal 认证流程分析
linux·运维·服务器
神威难绷泪9 小时前
Linux消息队列 & 共享内存 笔记
linux·消息队列·共享内存