在 pkg-config 中使用 Requires 与 Requires.private 时,链接过程有什么不同?

问题描述 投票:3回答:1

我指的是这个 pkg-config指南 为学习如何写一个。

其中有一处提到了关于 要求Requires.private 字段。

要求Requires.private 定义库所需的其他模块。通常最好使用Requires的私有变体,以避免将不必要的库暴露给与你的库链接的程序。如果程序不会使用所需库的符号,就不应该直接链接到该库。

我明白其中的含义,但我不太明白这两种情况下的链接过程有什么不同,即给定这两个版本的*.pc,链接过程将如何工作?

bar1.pc:

prefix=/usr
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=${exec_prefix}/lib

Name: bar
Description: The bar library
Version: 2.1.2
Requires.private: foo >= 0.7
Cflags: -I${includedir}
Libs: -L${libdir} -lbar

bar2.pc:

prefix=/usr
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=${exec_prefix}/lib

Name: bar
Description: The bar library
Version: 2.1.2
Requires: foo >= 0.7
Cflags: -I${includedir}
Libs: -L${libdir} -lbar
shared-libraries pkg-config
1个回答
1
投票

对于动态链接,所有 Requires 库将成为 程序 (applib链接到你的lib)。如果您使用 Requires.private,只有你的lib会链接到依赖关系,而不是程序。

有了 Requires:

+----------------+   +----------------+   +---------------+
| program        |-->| your lib       |-->| required lib  |
|                |   +----------------+   |               |
|                |----------------------->|               |
+----------------+                        +---------------+

Requires.private:

+----------------+   +----------------+   +---------------+
| program        |-->| your lib       |-->| required lib  |
+----------------+   +----------------+   +---------------+
© www.soinside.com 2019 - 2024. All rights reserved.