我有一个分为前端和多个后端的库。客户端程序必须链接到前端库和一个后端库。当为前端调用 pkg-config 时,我希望 pkg-config 强制指定某些后端。
我们称前端为 libfoo-frontend,后端为 libfoo-backend-alpha 和 libfoo-backend-beta。
一个明显的解决方案似乎是反转依赖关系——让每个后端都有“要求:libfoo-frontend”。但是,这不起作用,因为 pkg-config 将在 libfoo-frontend 标志之前给出 libfoo-backend 标志。即,我们最终会得到一个带有“-lfoo-backend-alpha -lfoo-frontend”的链接命令行,并且链接器最终不会包含 libfoo-backend-alpha,因为它不满足任何未满足的依赖项前面的对象,然后当 libfoo-frontend 中的依赖项未满足时将失败。
我目前的解决方案是 pkg-config 规范没有指定前端和后端之间的依赖关系。由用户来链接前端和一些后端。缺点是用户必须知道这是必需的,如果他们忘记链接到后端,他们将导致链接失败并出现未满足的依赖关系,这是相对缺乏信息的。
我希望的一个解决方案是让前端规范有一行像'Requires:libfoo-backend',所有后端pkg-config规范都有一行像'Provides:libfoo-backend'。然后,用户将执行类似“pkg-config --libs libfoo-frontend libfoo-backend-beta”的操作。如果用户忘记指定某个后端,pkg-config 会抱怨以提醒他们。不幸的是,pkg-config 没有这样的 'Requires' 关键字。