DTK 对 pkg-config 命令的支持
DTK 对 pkg-config 命令的支持
[TOC]
# Pkg-config 命令介绍
# pkg-config 的作用
在使用第三方库开发程序的时候,编译和链接阶段需要指定库的头文件和库文件的位置。如果库文件的和头文件的数量很多,手动指定会很繁琐,这个时候 pkg-config 就可以站出来了。
范例:使用库 dtkcore 编译程序
g++ main.c `pkg-config --cflags --libs dktcore` -o main
参数 --cflags:指定头文件;--libs:指定库文件。
# 支持 pkg-config 查找机制
当我们开发了一个新的第三方库,需要编写自己库的 .pc 文件放在特定目录下;这样 pkg-config 命令可以解析 XXX.pc 文件知道第三方库的头文件和库文件的位置。
# pc 文件规范
- Name: 一个针对library或package的便于人阅读的名称。这个名称可以是任意的,它并不会影响到pkg-config的使用,pkg-config是采用pc文件名的方式来工作的。
- Description: 对package的简短描述。
- URL: 人们可以通过该URL地址来获取package的更多信息或者package的下载地址。
- Version: 指定package版本号的字符串。
- Requires: 本库所依赖的其他库文件。所依赖的库文件的版本号可以通过使用如下比较操作符指定:=,<,>,<=,>=。
- Requires.private: 本库所依赖的一些私有库文件,但是这些私有库文件并不需要暴露给应用程序。这些私有库文件的版本指定方式与Requires中描述的类似。
- Conflicts: 是一个可选字段,其主要用于描述与本package所冲突的其他package。版本号的描述也与Requires中的描述类似。本字段也可以取值为同一个package的多个不同版本实例。例如: Conflicts: bar < 1.2.3, bar >= 1.3.0。
- Cflags: 编译器编译本package时所指定的编译选项,和其他并不支持pkg-config的library的一些编译选项值。假如所需要的library支持pkg-config,则它们应该被添加到Requires或者Requires.private中。
- Libs: 链接本库时所需要的一些链接选项,和其他一些并不支持pkg-config的library的链接选项值。与Cflags类似。
- Libs.private: 本库所需要的一些私有库的链接选项。
# pkg-config 常用命令
pkg-config --list-all
列出所有可使用的连接库
pkg-config --cflags XXX
取得该连接库的 CFLAGS 参数。(Cflags)
pkg-config --libs XXX
取得该连接库的 LDFLAGS 参数。(Libs)
pkg-config --version
取得 pkg-config 版本号。
# DTK 支持 pkg-config
在安装 DTK 开发库时,会在指定的目录下安装对应项目的 .pc 文件。
libdtkwidget-dev` 对应的 .pc 文件和所在目录 `/usr/lib/x86_64-linux-gnu/pkgconfig/dtkwidget.pc
libdtkcore-dev` 对应的 .pc 文件和所在目录 `/usr/lib/x86_64-linux-gnu/pkgconfig/dtkcore.pc
libdtkgui-dev 对应的` .pc 文件和所在目录 `/usr/lib/x86_64-linux-gnu/pkgconfig/dtkgui.pc
dtkwidget.pc 文件内容结构
prefix=/usr
exec_prefix=${prefix}
libdir=${prefix}/lib/x86_64-linux-gnu
includedir=${prefix}/include/libdtk-5.1.2/DCore/../DWidget
Name: DTKWIDGET
Description: Deepin Tool Kit dtkwidget header files
Version: 5.1.2.2
Libs: -ldtkwidget
Cflags: -I${includedir}
Requires: dtkcore, dtkgui
dtkcore.pc 文件内容结构
prefix=/usr
exec_prefix=${prefix}
libdir=${prefix}/lib/x86_64-linux-gnu
includedir=${prefix}/include/libdtk-5.2.0/DCore
Name: DTKCORE
Description: Deepin Tool Kit dtkcore header files
Version: 5.2.0.1
Libs: -ldtkcore
Cflags: -I${includedir}
dtkgui.pc 文件内容结构
prefix=/usr
exec_prefix=${prefix}
libdir=${prefix}/lib/x86_64-linux-gnu
includedir=${prefix}/include/libdtk-5.1.2/DCore/../DGui
Name: DTKGUI
Description: Deepin Tool Kit dtkgui header files
Version: 5.2.0.2
Libs: -ldtkgui
Cflags: -I${includedir}
Requires: dtkcore
# DTK 支持 cmake
# make 之 find_package 用法
find_package(xxx REQUIRED)
如果找到 xxx 库,就可以在接下来使用 xxx_INCLUDE_DIRS
和 xxx_LIBRARIES
这两个变量,比如:
include_directories(${xxx_INCLUDE_DIRS})
target_link_libraries(exec ${xxx_LIBRARIES})
# find_package 原理
camke 搜索库并给变量赋值,依赖于 FindXXX.cmake
文件和 XXXConfig.cmake
文件。库的作者通常会提供这两个文件,以方便使用者调用。
find_package 采用两种模式搜索库:
- Module 模式:搜索
CMAKE_MODULE_PATH
指定路径下的FindXXX.cmake
文件,执行该文件从而找到 XXX 库。具体查找库并给XXX_INCLUDE_DIRS
和XXX_LIBRARIES
两个变量赋值的操作由FindXXX.cmake
模块完成。 - Config 模式:搜索
XXX_DIR
指定路径下的XXXConfig.cmake
文件,执行该文件从而找到 XXX 库。具体查找库并给XXX_INCLUDE_DIRS
和XXX_LIBRARIES
两个变量赋值的操作由XXXConfig.cmake
模块完成。
cmake 默认采用 Module 模式,如果 Module 模式未找到库,才会采用 Config 模式。
# DTK 对 cmake 的 find_package 支持
DTK 开发库在安装时,会安装对应的 cmake 文件,如下:
库名 libdtkwidget-dev
/usr/lib/x86_64-linux-gnu/cmake/DtkWidget/DtkWidgetConfig.cmake
库名 libdtkcore-dev
/usr/lib/x86_64-linux-gnu/cmake/Dtk/DtkConfig.cmake
/usr/lib/x86_64-linux-gnu/cmake/DtkCMake/DtkCMakeConfig.cmake
/usr/lib/x86_64-linux-gnu/cmake/DtkCore/DtkCoreConfig.cmake
/usr/lib/x86_64-linux-gnu/cmake/DtkTools/DtkToolsConfig.cmake
库名 libdtkgui-dev
/usr/lib/x86_64-linux-gnu/cmake/DtkGui/DtkGuiConfig.cmake