当我使用 CUDA=1 `make` 暗网时,`/usr/bin/ld: cannot find -lcuda`发生。如何在没有root权限的情况下修复它
Posted
技术标签:
【中文标题】当我使用 CUDA=1 `make` 暗网时,`/usr/bin/ld: cannot find -lcuda`发生。如何在没有root权限的情况下修复它【英文标题】:When I `make` darknet with CUDA=1, `/usr/bin/ld: cannot find -lcuda`occured. How to fix it without root permission 【发布时间】:2020-11-09 23:02:34 【问题描述】:我正在尝试在计算集群上使用暗网训练 YOLOv4。但是当我make
暗网时,却出现了:
/usr/bin/ld: cannot find -lcuda
collect2: error: ld returned 1 exit status
make: *** [darknet] Error 1
这个计算集群可以加载module load
的软件。例如,当我需要 CUDA10.2 时,只需运行 module load devel/cuda/10.2
。
这意味着CUDA的文件仍然位于系统目录中,我无权修改任何文件。
在这种情况下,我该如何解决这个问题?
有关此错误的更多详细信息:
[usr@*hpc darknet]$ make
chmod +x *.sh
g++ -std=c++11 -std=c++11 -Iinclude/ -I3rdparty/stb/include -DOPENCV `pkg-config --cflags opencv4 2> /dev/null || pkg-config --cflags opencv` -DGPU -I/usr/local/cuda/include/ -DCUDNN -Wall -Wfatal-errors -Wno-unused-result -Wno-unknown-pragmas -fPIC -Ofast -DOPENCV -DGPU -DCUDNN -I/usr/local/cudnn/include obj/image_opencv.o obj/http_stream.o obj/gemm.o obj/utils.o obj/dark_cuda.o obj/convolutional_layer.o obj/list.o obj/image.o obj/activations.o obj/im2col.o obj/col2im.o obj/blas.o obj/crop_layer.o obj/dropout_layer.o obj/maxpool_layer.o obj/softmax_layer.o obj/data.o obj/matrix.o obj/network.o obj/connected_layer.o obj/cost_layer.o obj/parser.o obj/option_list.o obj/darknet.o obj/detection_layer.o obj/captcha.o obj/route_layer.o obj/writing.o obj/box.o obj/nightmare.o obj/normalization_layer.o obj/avgpool_layer.o obj/coco.o obj/dice.o obj/yolo.o obj/detector.o obj/layer.o obj/compare.o obj/classifier.o obj/local_layer.o obj/swag.o obj/shortcut_layer.o obj/activation_layer.o obj/rnn_layer.o obj/gru_layer.o obj/rnn.o obj/rnn_vid.o obj/crnn_layer.o obj/demo.o obj/tag.o obj/cifar.o obj/go.o obj/batchnorm_layer.o obj/art.o obj/region_layer.o obj/reorg_layer.o obj/reorg_old_layer.o obj/super.o obj/voxel.o obj/tree.o obj/yolo_layer.o obj/gaussian_yolo_layer.o obj/upsample_layer.o obj/lstm_layer.o obj/conv_lstm_layer.o obj/scale_channels_layer.o obj/sam_layer.o obj/convolutional_kernels.o obj/activation_kernels.o obj/im2col_kernels.o obj/col2im_kernels.o obj/blas_kernels.o obj/crop_layer_kernels.o obj/dropout_layer_kernels.o obj/maxpool_layer_kernels.o obj/network_kernels.o obj/avgpool_layer_kernels.o -o darknet -lm -pthread `pkg-config --libs opencv4 2> /dev/null || pkg-config --libs opencv` -L/usr/local/cuda/lib64 -lcuda -lcudart -lcublas -lcurand -L/usr/local/cudnn/lib64 -lcudnn -lstdc++
/usr/bin/ld: cannot find -lcuda
collect2: error: ld returned 1 exit status
make: *** [darknet] Error 1
【问题讨论】:
【参考方案1】:在安装了 GPU(和驱动程序)的机器上,通常可以满足 -lcuda
依赖项,因为驱动程序会在链接搜索路径(通常)中安装 libcuda.so
(或 Windows 上的等效项)。
但是在没有安装 GPU 的机器上(例如,登录节点或集群中的构建机器)驱动程序不会安装,因此libcuda.so
不会在“通常的位置”。
在这些情况下,会提供“存根”库,通常位于 CUDA 工具包库安装目录下的 /stubs
目录中(例如 /usr/local/cuda/lib64
)。
因此,如果您将 this line 的 Makefile 更改为:
LDFLAGS+= -L/usr/local/cuda/lib64 -lcudart -lcublas -lcurand -L/usr/local/cuda/lib64/stubs -lcuda
它应该允许找到该库。
【讨论】:
感谢您的快速回复!在 Makefile 中更改该行后,再次出现相同的问题。很奇怪。 'LDFLAGS+= -L/usr/local/cuda/lib64 -lcudart -lcublas -lcurand -L/usr/local/cuda/lib64/stubs -lcuda' 在'make'之后:/usr/bin/ld: 找不到 -lcuda collect2: 错误: ld 返回 1 退出状态 make: *** [darknet] 错误 1 您的/usr/local/cuda/lib64
目录有stubs
目录吗? stubs
目录中是否有 libcuda.so
文件?更改Makefile
并重新运行make 后,产生错误的g++
命令是什么?是否反映了LDFLAGS
的变化?
是的,/opt/bwhpc/common/devel/cuda/10.2/lib64/libcuda.so 确实存在。
输出如下: $ make chmod +x *.sh g++ -std=c++11 -std=c++11 -Iinclude/ -I3rdparty/stb/include -DOPENCV pkg-config --cflags opencv4 2> /dev/null || pkg-config --cflags opencv
- DGPU -I/usr/local/cuda/include/ -DCUDNN -Wall -Wfatal-errors -Wno-unused-result -Wno-unknown-pragmas -fPIC -Ofast -DOPENCV -DGPU -DCUDNN -I/usr/local/cudnn /include obj/image_opencv.o obj/http_stream.o obj/gemm.o obj/utils.o obj/dark_cuda.o obj/convolutional_layer.o obj/list.o obj/image.o
obj/activations.o obj/im2col.o obj/col2im.o obj/blas.o obj/crop_layer.o obj/dropout_layer.o obj/maxpool_layer.o obj/softmax_layer.o obj/ data.o obj/matrix.o obj/network.o obj/connected_layer.o obj/cost_layer.o obj/parser.o obj/option_list.o obj/darknet.o obj/detection_layer.o obj/captcha.o obj/ route_layer.o obj/writing.o obj/box.o obj/nightmare.o obj/normalization_layer.o obj/avgpool_layer.o obj/coco.o obj/dice.o obj/yolo.o obj/detector.o obj/ layer.o obj/compare.o obj/classifier.o obj/local_layer.o obj/swag.o obj/shortcut_layer.o obj/activation_layer.o obj/rnn_layer.o obj/gru_layer.o obj/rnn.o跨度>
以上是关于当我使用 CUDA=1 `make` 暗网时,`/usr/bin/ld: cannot find -lcuda`发生。如何在没有root权限的情况下修复它的主要内容,如果未能解决你的问题,请参考以下文章