我们可以在 运行 时间传递目标依赖项之一所需的共享库吗?
can we pass a shared library that one of our target's dependency needs at run time?
A.so
由第三方提供
B.so
取决于 A.so
,但在
makefile,B.so
不是 linked 到 A.so
(不是动态的也不是
静态)。
C
是 B
库的测试可执行文件。在里面
makefile,C
动态 linked 到 B
和 A
.
ldd B.so
- 不依赖于A.so,这是预期的
ldd C
- 依赖于A.so和B.so
make B
可以很好地编译和构建 B。
make C
编译和构建 B
和 C
很好。
./C
运行没有问题(这让我很惊讶)
问题:
- C
可以在 运行 时将 A.so
的位置传递给需要的 B
吗?
- B.so 真的需要 link 反对 A.so 或者如果其中一位家属在 link 时间内解决了这个问题就可以了。
- 如果是这样,在 C
处解决的依赖关系的顺序可能会导致 B.so
出现问题。例如,如果 C
在 A.so
之前解析 B.so
B 将失败。但如果它首先解析 A.so
,那么 B.so
会找到它所需要的。或者加载顺序已知,这正是 ldd
命令
输出中显示的顺序
Can C pass down the location of A.so at run time to B when it needs it?
不清楚你的意思。
C
已经 安排加载 A.so
(通过 linking 到 A.so
)。 还有你想“传下去”什么?
- Does B.so really need to link against A.so or it is ok if one of the dependents resolves that for it during link time.
它没有(如您所见)。但不是 linking B.so
反对 A.so
是容易出错的,通常被认为是一种不好的做法。
For example, if C resolves B.so before A.so B would fail.
同样不清楚您所说的“在 A.so 之前解析 B.so”是什么意思。
当你的二进制 C
以任何顺序直接 link 反对 A.so
和 B.so
时,A.so
和 B.so
都被加载在 C
的第一条指令执行之前由动态 linker 执行。
仅当 A.so
和 B.so
定义了冲突的符号时,顺序才重要。在这种情况下,第一个定义该符号的库“获胜”(使用它的符号)。
Or the order of loading known which is exactly what is displayed in the output of ldd command
是的,加载顺序是由您 link 一切的方式预定义的,完全 ldd
命令打印的内容。
A.so
由第三方提供B.so
取决于A.so
,但在 makefile,B.so
不是 linked 到A.so
(不是动态的也不是 静态)。C
是B
库的测试可执行文件。在里面 makefile,C
动态 linked 到B
和A
.ldd B.so
- 不依赖于A.so,这是预期的
ldd C
- 依赖于A.so和B.so
make
B
可以很好地编译和构建 B。make
C
编译和构建B
和C
很好。./C
运行没有问题(这让我很惊讶)问题:
输出中显示的顺序
-C
可以在 运行 时将A.so
的位置传递给需要的B
吗?
- B.so 真的需要 link 反对 A.so 或者如果其中一位家属在 link 时间内解决了这个问题就可以了。
- 如果是这样,在C
处解决的依赖关系的顺序可能会导致B.so
出现问题。例如,如果C
在A.so
之前解析B.so
B 将失败。但如果它首先解析A.so
,那么B.so
会找到它所需要的。或者加载顺序已知,这正是ldd
命令
Can C pass down the location of A.so at run time to B when it needs it?
不清楚你的意思。
C
已经 安排加载 A.so
(通过 linking 到 A.so
)。 还有你想“传下去”什么?
- Does B.so really need to link against A.so or it is ok if one of the dependents resolves that for it during link time.
它没有(如您所见)。但不是 linking B.so
反对 A.so
是容易出错的,通常被认为是一种不好的做法。
For example, if C resolves B.so before A.so B would fail.
同样不清楚您所说的“在 A.so 之前解析 B.so”是什么意思。
当你的二进制 C
以任何顺序直接 link 反对 A.so
和 B.so
时,A.so
和 B.so
都被加载在 C
的第一条指令执行之前由动态 linker 执行。
仅当 A.so
和 B.so
定义了冲突的符号时,顺序才重要。在这种情况下,第一个定义该符号的库“获胜”(使用它的符号)。
Or the order of loading known which is exactly what is displayed in the output of ldd command
是的,加载顺序是由您 link 一切的方式预定义的,完全 ldd
命令打印的内容。