【问题标题】:Can run executables using CUDA from command-line, but failing to find some .so file when debugging them可以从命令行使用 CUDA 运行可执行文件,但在调试时找不到某些 .so 文件
【发布时间】:2020-09-02 05:26:27
【问题描述】:

我编写了一个可以编译和运行的 CUDA 应用程序。但是,当我尝试通过 Eclipse CDT 或通过 kdbg 调试/运行它们时,我收到一条错误消息,例如:

/path/to/executable: error while loading shared libraries: libnvToolsExt.so.1: cannot open shared object file: No such file or directory

或使用libcudart.so.10.2 代替的类似消息。

如果可执行文件自行运行,为什么会发生这种情况,我该怎么办?

关于我的系统的信息:

  • Debian 派生的 GNU/Linux
  • CUDA 10.2 手动安装(未安装发行版提供的 CUDA 包)
  • Eclipse CDT 版本 2018-09 (4.9.0)
  • kdbg 版本 2.5.5
  • X86_64 机器

【问题讨论】:

    标签: cuda shared-libraries eclipse-cdt ld


    【解决方案1】:

    手动安装 CUDA 工具包(有或没有 nVIDIA 内核驱动程序)不会使其库在系统上显眼地“可见”。如果您使用的是非 CUDA 二进制文件(编译器、链接器/加载器等) - 它根本不会知道安装。具体来说,当您尝试运行为使用共享库而构建的可执行文件时,加载程序(系统上的 GNU ld)必须能够找到这些库。对于给定的可执行文件,您可以使用readelf(或使用other methods)获取它们的列表。一个典型的例子:

    $ readelf -d my_cuda_app | grep 'NEEDED'
     0x0000000000000001 (NEEDED)             Shared library: [libnvToolsExt.so.1]
     0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
     0x0000000000000001 (NEEDED)             Shared library: [libdl.so.2]
     0x0000000000000001 (NEEDED)             Shared library: [librt.so.1]
     0x0000000000000001 (NEEDED)             Shared library: [libcudart.so.10.2]
     0x0000000000000001 (NEEDED)             Shared library: [libcupti.so.10.2]
     0x0000000000000001 (NEEDED)             Shared library: [libOpenCL.so.1]
     0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
     0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
     0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
    

    (至少)有两种方法可以使共享库可访问(即,将其添加到 GNU ld 的搜索路径):

    1. 将库的目录添加到LD_LIBRARY_PATH 环境变量中。
    2. 将库的目录添加到/etc/ld.so.conf,或添加到/etc/ld.so.conf.d 中的文件,以防您的/etc/ld.so.conf 从子目录中递归读取其配置

    很遗憾,手动 CUDA 安装程序不建议您应用第二种方法,也不建议您自己这样做。

    您必须选择这两种方法中的第一种——因此可以在 shell 会话中执行您的二进制文件。但是,Eclipse CDT 和 kdbg(可能还有其他 IDE 和调试器)在 w.r.t 方面相当严格。构建程序的执行,并且必须“清理”LD_LIBRARY_PATH 变量的可执行文件环境。

    除了LD_LIBRARY_PATH 之外,还可以使用手动安装的 CUDA 库目录创建一个名为 /etc/ld.so.conf.d/cuda 的文件,例如:

    /usr/local/cuda-10.2/targets/x86_64-linux/lib
    

    这应该允许 kdbg 和 Eclipse CDT 调试您的应用程序。

    【讨论】:

    • 是的,这正是正在发生的事情。我有点犹豫,如果这个特定的问答实例应该保留在 StackOverflow 上。使用库以及链接器如何定位库,以及影响它的因素 a) 远远超出 CUDA 和 b) 应被视为开发人员的基础知识。我宁愿在这里进行更一般的问答,或者删除这个特定的实例。这有点多余,在肤浅的眼里可能看起来像一个角落案例,但事实并非如此。
    • @datenwolf:很多关于特定框架/库/环境的问题最终成为更普遍/基本问题的具体案例。但是 - 如果这个问题很容易或经常出现,而开发人员没有以某种深奥的方式搞乱他们的系统 - 那么这样的问题是合理的。话虽如此 - 如果有关于同一问题的问答并没有特别提到 CUDA,那么这个问题可能会被那个问题所欺骗。另外,请参阅我即将进行的编辑。
    猜你喜欢
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多