pkg-config到底是个啥

本文详细介绍了Pkg-config工具的功能及用途,它可以帮助开发者在编译过程中查找已安装库的接口,简化了链接库文件和头文件的过程。文章还提供了如何在Makefile和CMake中使用Pkg-config的方法,并附带了一个PC文件的编写示例。

Pkg-config到底是个啥


😄

Pkgconfig其实跟使用的CMakeList文件中的配置文件作用是一样的,都是为了在需要使用第三方头文件或库文件的时候告诉编译器头文件和库文件的位置

百度百科的解释是

pkg-config 是一个在源代码编译时查询已安装的库的使用接口的计算机工具软件。pkg-config原本是设计用于Linux的,但现在在各个版本的BSD、windows、Mac OS X和Solaris上都有着可用的版本。

使用方法

gcc -o test test.c $(pkg-config --libs --cflags libpng)

当安装一个库的时候,会有一个.pc文件,通过pc文件就能知道所需要的头文件和库所在的位置。

其中cflags指定的是头文件

其中libs指定的是库文件

如何找到pc文件???

在linux系统下面,默认查找的路径是/usr/lib64/pkgconfig

当然可以手动指定,也就是通过设置PKG_CONFIG_PATH这个环境变量来进行指定路径下查找.pc文件

makefile中使用pkgconfig

在Cmake的文件中的时候可以使用FindPkgConfig进行查找pkg-config模块

PKGCONFIG(package includedir libdir linkflags cflags)

例如

PKGCONFIG(libart-2.0 LIBART_INCLUDE_DIR LIBART_LINK_DIR LIBART_LINK_FLAGS LIBART_CFLAGS) 

makefile书写规则

makefile使用

CFLAGS=-Wall -g -std=c++11 `pkg-config --cflags --libs opencv realsense2`

如何编写PC文件

prefix=/home/zhongsy/Downloads/Game/gaminganywhere/deps.posix
exec_prefix=${prefix}
libdir=${prefix}/lib
includedir=${prefix}/include

Name: libavdevice
Description: FFmpeg device handling library
Version: 56.4.100
Requires: 
Requires.private: libavfilter >= 5.40.101, libswscale >= 3.1.101, libpostproc >= 53.3.100, libavformat >= 56.40.101, libavcodec >= 56.60.100, libswresample >= 1.2.101, libavutil >= 54.31.100
Conflicts:
Libs: -L${libdir}  -lavdevice 
Libs.private: -lXv -lX11 -lXext -lxcb -lxcb-shm -lxcb -lxcb-xfixes -lxcb-render -lxcb-shape -lxcb -lxcb-shape -lxcb -lX11 -lsndio -lasound -lxvidcore -L/home/zhongsy/Downloads/Game/gaminganywhere/deps.posix/lib -lx265 -lx264 -lvpx -lm -lvpx -lm -lvpx -lm -lvpx -lm -lvorbisenc -lvorbis -logg -ltheoraenc -ltheoradec -logg -lopus -lmp3lame -lm -llzma -lbz2 -lz -pthread
Cflags: -I${includedir}

pc文件中主要有的是一下几个变量

  1. Name 名称
  2. Description 描述
  3. version 版本
  4. cflags 所需要使用头文件的目录路径
  5. libs 所需要库文件的目录路径

参考

Cmake findpakage详解

Cmake教程

<think>我们正在讨论的是在交叉编译环境中pkg-config工具的使用问题。用户提到一个特定的pkg-config工具:arm-rockchip830-linux-uclibcgnueabihf-pkg-config,并且遇到了未找到的错误,同时指出系统默认的pkg-config路径在/usr/bin/pkg-config且版本至少为0.9.0。 首先,需要理解pkg-config的作用:它是一个帮助在编译和链接时查找库文件的工具,通过查询.pc文件来获取库的头文件路径、库文件路径以及编译和链接选项。 在交叉编译环境中,我们通常需要使用针对目标平台(这里是arm-rockchip830-linux-uclibcgnueabihf)的pkg-config工具,而不是主机系统自带的pkg-config(/usr/bin/pkg-config)。这是因为主机系统的pkg-config只能提供主机系统上安装的库的信息,而交叉编译需要目标平台的库信息。 用户遇到的问题是找不到arm-rockchip830-linux-uclibcgnueabihf-pkg-config。这通常意味着: 1. 该特定的pkg-config工具没有安装在系统中。 2. 虽然安装了,但不在PATH环境变量所包含的路径中。 另外,用户提到默认的pkg-config路径为/usr/bin/pkg-config,且版本至少为0.9.0。这个默认的pkg-config是主机系统的,它的版本符合要求,但无法用于交叉编译。 因此,我们需要: 1. 确保已经安装了针对目标平台的pkg-config工具。通常,这个工具是由交叉编译工具链提供的,或者需要单独安装。 2. 如果已经安装,需要将其所在的目录添加到PATH环境变量中,这样在编译时才能找到它。 另外,在交叉编译时,通常我们会通过设置环境变量来指定使用哪个pkg-config工具,例如: ```bash export PKG_CONFIG=/path/to/arm-rockchip830-linux-uclibcgnueabihf-pkg-config ``` 或者在配置时通过参数指定: ```bash ./configure ... PKG_CONFIG=/path/to/arm-rockchip830-linux-uclibcgnueabihf-pkg-config ``` 如果确实没有安装,我们需要安装该工具。它可能包含在交叉编译工具链的包中,也可能需要单独构建。 现在,根据用户提供的引用,我们注意到在引用[3]中,用户提到了移植x264时使用`--host=arm-linux`配置,并且指定了CC、LD等工具链。同样,在引用[1]中,配置ffmpeg时指定了`--cc=aarch64-buildroot-linux-gnu-gcc`等。这些都是在指定交叉编译工具链。 因此,对于用户的问题,我们需要检查是否安装了针对arm-rockchip830-linux-uclibcgnueabihf的pkg-config工具,以及如何设置环境使其可用。 具体步骤建议: 1. 检查工具链安装路径下是否有名为`arm-rockchip830-linux-uclibcgnueabihf-pkg-config`的可执行文件。通常,交叉编译工具链会提供一系列以目标平台为前缀的工具,如arm-rockchip830-linux-uclibcgnueabihf-gcc,同样也会有pkg-config。 2. 如果找到,将该工具所在目录加入PATH环境变量。 3. 如果没有,可能需要重新安装工具链,或者单独安装pkg-config的交叉编译版本。 此外,也可以考虑使用`pkg-config`的`--host`选项(如果支持)来指定目标平台,但更常见的是使用目标平台前缀的pkg-config。 最后,用户可能还需要确保已经为目标平台安装了所需的库,并且这些库的.pc文件位于pkg-config的搜索路径中。可以通过设置环境变量`PKG_CONFIG_PATH`来指定额外的搜索路径,例如: ```bash export PKG_CONFIG_PATH=/path/to/target-platform/lib/pkgconfig ``` 总结:错误信息表明交叉编译所需的pkg-config工具缺失,需要安装并配置正确的工具链环境。 </think> ### 理解 `pkg-config` 错误信息的含义 你遇到的关于 `arm-rockchip830-linux-uclibcgnueabihf-pkg-config` 的错误信息,核心含义如下: 1. **工具链缺失** `未找到 arm-rockchip830-linux-uclibcgnueabihf-pkg-config` 表示编译系统需要针对 **Rockchip ARM 平台**的专用 `pkg-config` 工具,但当前系统中不存在该工具链组件。 - 交叉编译需要目标平台(ARM)的 `pkg-config` 而非主机平台(x86)的版本[^3] - 工具链名称 `arm-rockchip830-linux-uclibcgnueabihf` 表明目标架构是 ARMv8(Rockchip 830 系列),使用 uClibc 库和硬件浮点支持(gnueabihf) 2. **主机 `pkg-config` 的干扰** `pkg-config 路径为 /usr/bin/pkg-config` 说明系统使用了 **默认的主机平台工具**(通常是 x86_64 架构),这会导致: - 错误检测主机库路径(如 `/usr/lib`)而非 ARM 目标库路径 - 生成错误的编译/链接参数(如使用 x86 汇编指令) - 版本冲突(即使主机版本 ≥0.9.0 也不兼容 ARM 目标) 3. **根本原因与解决方案** | 现象 | 含义 | 解决方法 | |------|------|----------| | 缺失交叉编译版 `pkg-config` | 工具链不完整 | 安装完整 ARM 工具链(需包含 `*-pkg-config`) | | 使用主机版 `/usr/bin/pkg-config` | 环境配置错误 | 通过 `export PKG_CONFIG=arm-xxx-pkg-config` 指定正确工具 | | 版本 ≥0.9.0 但无效 | 架构不匹配 | 在配置脚本中显式设置 `--pkg-config=目标平台工具路径` | ### 修复步骤建议 1. **确认工具链安装** 检查工具链目录(如 `/opt/toolchain/`)是否存在 `arm-rockchip830-linux-uclibcgnueabihf-pkg-config`,若缺失需重新安装 SDK。 2. **配置环境变量** 在编译前执行: ```bash export PKG_CONFIG=arm-rockchip830-linux-uclibcgnueabihf-pkg-config export PKG_CONFIG_PATH=/path/to/arm-libs/pkgconfig # 指向ARM库的.pc文件目录 ``` 3. **显式指定工具路径** 在 `./configure` 命令中添加参数(参考你提供的 FFmpeg 配置[^1]): ```bash ./configure \ --pkg-config=arm-rockchip830-linux-uclibcgnueabihf-pkg-config \ --host=arm-rockchip830-linux-uclibcgnueabihf \ ... # 其他参数 ``` ### 关键概念说明 - **`pkg-config` 的作用** 通过查询 `.pc` 文件提供库的编译参数(如 `-I/... -L/... -lxxx`),确保编译器找到正确的头文件和库[^3]。 - **交叉编译工具链命名规则** `arm-rockchip830-linux-uclibcgnueabihf-` 前缀表明: - `arm`: ARM 架构 - `rockchip830`: 芯片厂商和型号 - `linux`: 目标操作系统 - `uclibcgnueabihf`: C 库类型(uClibc)及硬件浮点支持
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值