ctypes.util.find_library是否符合Linux中的“通常”库链接实践?

时间:2018-02-23 13:24:08

标签: linux linker shared-libraries dynamic-linking

最近我遇到了Python函数ctypes.util.find_library的问题。该函数用于按名称定位共享库;例如,CuPy使用它来定位cuDNN。在我的情况下,我安装了几个版本的cuDNN,并且它获取了最新版本(根据文档)。但是,目录的内容如下所示:

$ l /usr/local/cuda-8.0/lib64 | grep -i cudnn                                                                                       
lrwxrwxrwx 1 root root         13 Oct  3 08:21 libcudnn.so -> libcudnn.so.6*
lrwxrwxrwx 1 1000 users        17 Jul 27  2016 libcudnn.so.5 -> libcudnn.so.5.1.5*
-rwxrwxr-x 1 1000 users  79337624 Jul 27  2016 libcudnn.so.5.1.5*
lrwxrwxrwx 1 root root         18 Oct  3 08:21 libcudnn.so.6 -> libcudnn.so.6.0.21*
-rwxr-xr-x 1 1000 users 154322864 Apr 12  2017 libcudnn.so.6.0.21*
lrwxrwxrwx 1 root root         17 Oct  2 10:32 libcudnn.so.7 -> libcudnn.so.7.0.3*
-rwxrwxr-x 1 1000  1000 217188104 Sep 16 05:09 libcudnn.so.7.0.3*
-rw-r--r-- 1 1000 users 143843808 Apr 12  2017 libcudnn_static.a

即使最新版本是7.0.3,从符号链接层次结构来看,我也希望能够获得版本6.0.21。我的问题是:

  1. gcc(或clang)工具链在编译期间会选择哪个版本?
  2. 在运行时期间C / C ++可执行文件会找到哪个版本?
  3. 是否有任何类型的信息来源(文章,手册页,书籍......)明确包含前两个问题的答案?我试着谷歌搜索它,但没有确定的确定。

1 个答案:

答案 0 :(得分:1)

  1. 传统上,您使用gcc -lcudnn之类的命令进行构建。这会找到libcudnn.so,其指向libcudnn.so.6,指向libcudnn.so.6.0.21。因此libcudnn.so.6.0.21会在构建时链接。

  2. 传统上,共享库将包含一个" SONAME"表示要在运行时加载的ABI兼容版本。我非常确定在这种情况下会libcudnn.so.6。因此,针对libcudnn.so.6.0.21构建将为您提供libcudnn.so.6的运行时依赖性(您可以使用ldd myprog | grep libcudnn.so验证这一点。)

  3. 可能,但这不是Stack Overflow的主题问题("推荐非现场资源")。