【问题标题】:Problems Linking to libcuda.so链接到 libcuda.so 的问题
【发布时间】:2012-05-01 18:23:13
【问题描述】:

我被一个似乎很容易诊断和修复的问题难住了。我有一个使用 CUDA 驱动程序 API 的 C++ 源文件。当我使用nvcc 编译它时,可执行文件已生成并且可以正常工作。但是,当我尝试使用 g++ 编译它时,链接器会抱怨对 /usr/lib/libcuda.so 中的符号的未定义引用:

undefined reference to cuDeviceGet'
... undefined reference tocuDeviceComputeCapability'
... undefined reference to cuDeviceGetName'
... undefined reference tocuDeviceTotalMem_v2'
... undefined reference to cuDeviceGetAttribute'
... undefined reference tocuDeviceGetAttribute'
... undefined reference to cuDeviceGetAttribute'
... undefined reference tocuDeviceGetAttribute'

我试图确保/usr/lib 包含在库路径中(通过提供标志-L/usr/lib-lcuda,并将/usr/lib 添加到$LIBRARY_PATH)。但是,问题仍然存在。我确信/usr/lib/libcuda.so 包含链接器抱怨的符号:

$ nm -D /usr/lib/libcuda.so | grep cuDeviceGet
00000000000be410 T cuDeviceGet
00000000000bf120 T cuDeviceGetAttribute
00000000000d2e10 T cuDeviceGetByPCIBusId
00000000000be200 T cuDeviceGetCount
00000000000bdfa0 T cuDeviceGetName
00000000000d2bb0 T cuDeviceGetPCIBusId
00000000000bf380 T cuDeviceGetProperties
我觉得奇怪的是nvcc 成功编译了文件,但g++ 没有。您对我如何解决此问题有任何想法吗?

非常感谢您的帮助!

【问题讨论】:

  • 确保您还拥有 -lcuda 编译器标志以实际包含该库,并且您尝试链接的 libcuda.so 用于同一平台(32/64 位)。在 64 位版本上通常有一个 /usr/lib64
  • 我也包括了这个标志——我应该提到这一点,但我相应地更新了问题。
  • 作为一个新的 CUDA 用户我不明白的东西......这与 CUDA 工具包附带的 cuda 运行时(cudart)库不同。

标签: gcc linker cuda g++ shared-libraries


【解决方案1】:

好的,我无法编译文件的原因是-lcuda 标志必须出现在文件名之后。否则,它将无法正常工作......编译器会发出一个大而显着的警告,告诉我这些信息将不胜感激。好吧,那真是浪费了两个小时。

【讨论】:

  • 最糟糕的是我过去遇到过这个问题,应该意识到
  • 哈哈没关系,这是我绝对不会忘记的教训。
  • 可能会更糟。我被一个错误困住了一周,最终在 SO 上找到了答案。 (我的答案是公认的——显然从那以后我就睡着了。)
猜你喜欢
  • 1970-01-01
  • 2011-10-18
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多