【发布时间】:2019-03-04 13:58:23
【问题描述】:
我有一个链接到两个共享库的可执行文件,每个共享库都依赖于系统共享库。 (在这种情况下,这些是 OpenCL 和 CUDA 运行时库,但这不影响问题)
+--> libA.so ---> libOpenCL.so (on system)
Exe -|
+--> libB.so ---> libcudart.so (on system)
Exe、libA.so 和 libB.so 被分发给用户。用户可能没有在他们的系统上安装libOpenCL.so 和/或libcudart.so。
目标是Exe 无论如何都应该能够启动,并在运行时检测到,例如libA.so 无法加载,因为它的依赖关系不满足。
一种可能性是让libA.so 在运行时使用dlopen() 加载,它会检测加载是否失败。
是否也可以将libA.so 正常链接到Exe,但是如果libA.so 无法加载,Exe 仍然可以启动?这在 Linux 和/或 Windows 平台上可行吗?
【问题讨论】:
-
您是自己构建
libA和libB库还是外部库? -
@yugr 是的
libA和libB与Exe一起构建,具有相同的编译器/ABI。它们也可以是静态的,甚至是Exe的一部分。它们是库,主要是为了对它们的依赖项进行分组(例如libB需要多个 CUDA 库)
标签: c linux windows linker dynamic-linking