【发布时间】:2019-08-06 18:22:11
【问题描述】:
我有一个问题,如果我设法从 pkg-config 获取 Requires.private 中的列表而不是递归的,我想我可以解决这个问题。首先我会发布问题,然后我会尝试解决它。
问题:
我有一个纯静态库(我们称之为libfoo.a),没有pkg-config 文件,我只是将其作为程序的子模块包含在内。我必须在程序 makefile 中考虑我的库可能具有的所有依赖项,因为作为一个静态库,它没有携带它所依赖的共享库的信息。这意味着我必须在我的程序的 makefile 中动态链接很多库,但这很有效。
例子:
$(CC) $(OBJS) -o $@ -L path/foo/ -l foo `pkg-config --libs opencv gsl ncurses`
它起作用了,因为它只能找到一个静态版本的 libfoo,然后它有一个 libfoo 需要的列表(而不是程序实际动态需要的)。
现在我改进了该库,使其安装在/usr/local/ 中,提供pkg-config 文件,以及.a 和.so 文件。
当我动态链接到我的库时,一切都很好。
当我尝试静态链接时,如果程序根本不使用opencv,那很好(我不知道是opencv在尝试静态链接时坏了,还是我安装时坏了来自测试仓库的一些更新;如果我有一个干净的安装,我会知道,但我不知道)。当我尝试静态链接时出现问题,并且使用了一些 opencv。有一些库没有找到,所以我认为的解决方案是复制我安装库之前发生的事情。
但现在我不想在程序的 makefile 中硬编码我的库的依赖项,所以我使用 pkg-config。
我的尝试:
假设我的程序只直接依赖于 libfoo,而 libfoo 直接依赖于 opencv、gsl 和 ncurses(我的程序忽略了),这就是我要做的:
$(CC) $(OBJS) -o $@ -Wl,-Bstatic `pkg-config --libs foo` -Wl,-Bdynamic `pkg-config --static --libs foo`
第一个 pkg-config 是只公开 libfoo 以静态链接,第二个是公开 libfoo 的依赖项以动态链接。但问题是我暴露的不仅是 libfoo 的直接依赖,还有所有的递归依赖,这是我不想暴露的。
有没有办法只公开直接依赖项?或者这种情况还有其他解决方法吗?
在这种情况下,需要解决 openCV 损坏的问题,有人可能会说:嘿,用 openCV 解决这个问题,别管它了。
但这对于想要静态链接到性能至关重要的库但仍动态链接到其他不那么重要的较重库的人来说也很有用。
系统:
Debian 10
GCC 8
OpenCV 可能有一些通过测试安装的包或依赖项。
【问题讨论】:
标签: linker shared-libraries static-libraries libraries pkg-config