编译exafmm-alpha项目CUDA代码出现未定义引用错误如何解决
错误原因
你遇到的__cudaPopCallConfiguration、__cudaPushCallConfiguration等符号未定义报错,本质是最终链接阶段没有正确加载完整的CUDA依赖库,也未指定CUDA库文件的搜索路径,你当前使用mpif90作为最终链接器,它不会自动搜索CUDA的库路径。
修复步骤
- 第一步:补充CUDA库路径与依赖库
修改Makefile.include中GPU模式的LFLAGS配置,添加CUDA库搜索路径与缺失的依赖库:
ifeq ($(DEVICE),gpu) LFLAGS += -L$(CUDA_INSTALL_PATH)/lib64 -lcudart -lcuda endif
如果上述路径不存在,可替换为你本地实际的CUDA库路径,比如-L/usr/lib/cuda/lib64,你可以执行ls /usr/local/cuda/lib64/libcudart.so验证路径是否有效。
- 第二步:修正编译规则的参数传递
你当前把链接参数(LFLAGS)传给了仅编译不链接的阶段(带-c参数的编译命令),属于多余配置,可能引发额外问题,修改Makefile.include中的编译规则:
.cxx.o: $(CXX) -c $? -o $@ .cu.o: $(NVCC) -c $? -o $@ .f90.o: $(FC) -c $? -o $@
- 第三步:清理缓存后重新编译
删除之前编译生成的所有.o文件与libfmm.a静态库,再重新执行编译命令即可。
如果修改后依然报错,可以在NVCC编译参数中添加你当前GPU对应的架构标识,比如安培架构GPU添加-arch=sm_80、图灵架构添加-arch=sm_75,避免跨架构编译导致的符号缺失。
内容的提问来源于stack exchange,提问作者BideshSengupta
相关产品推荐
相关产品推荐

