我指的是这个 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
对于动态链接,所有 Requires
库将成为 程序 (applib链接到你的lib)。如果您使用 Requires.private
,只有你的lib会链接到依赖关系,而不是程序。
有了 Requires
:
+----------------+ +----------------+ +---------------+
| program |-->| your lib |-->| required lib |
| | +----------------+ | |
| |----------------------->| |
+----------------+ +---------------+
有 Requires.private
:
+----------------+ +----------------+ +---------------+
| program |-->| your lib |-->| required lib |
+----------------+ +----------------+ +---------------+