我想将libcudart.so链接到我的cuda代码,以便提供对这些函数的引用。当我在.so文件或.o文件上触发readelf -Ws时,它会显示多个UND(未定义)条目。请帮忙。
nvcc -c cuda/spmv/dispatch-float-float.cu -o cuda/spmv/dispatch-float-float.o -O2 -v -I. -gencode arch=compute_30,code=sm_30 -DCUDA_ARCH=30 --ptxas-options -v --cudafe-options --diag_suppress=code_is_unreachable --compiler-options -fPIC --compiler-options -fpermissive
这是我的编译代码。没有链接libcudart.so文件和CUDA函数的CUDA函数仍未定义。
这是我的Makefile,请提出修改建议。
NVCC = nvcc
CUDA_PATH = $(shell which $(NVCC) | sed s@/bin/nvcc@@)
CUDA_ARCH = 35
CUDA_INCLUDE := -I$(CUDA_PATH)/include/
CXXWARN := -Wall -Wno-sign-compare
CXXOPT := -O2
CXXFLAGS := $(CXXOPT) -g $(CXXWARN) -fPIC -I. $(CUDA_INCLUDE)
NVCCFLAGS := -O2 -v -I. -gencode arch=compute_$(CUDA_ARCH),code=sm_$(CUDA_ARCH) \
-DCUDA_ARCH=$(CUDA_ARCH) \
--ptxas-options -v \
--cudafe-options --diag_suppress=code_is_unreachable \
--compiler-options -fPIC
LIB = libispm0-pic.a
all: $(LIB)
SPMV_OBJS = cuda/spmv/dispatch-float-float.o cuda/spmv/dispatch-double-float.o cuda/spmv/dispatch-double-double.o
EXTRA_OBJS = util/cuda/sblas.o fastainv/fastainv.o util/cuda/initialize.o
OBJS = $(SPMV_OBJS) $(EXTRA_OBJS)
$(LIB): $(OBJS)
ar cr $@ $^
cuda/spmv/dispatch-%.o: cuda/spmv/dispatch-%.cu
$(NVCC) -c $< -o $@ $(NVCCFLAGS) --compiler-options -fpermissive
objcopy --localize-hidden $@
util/cuda/%.o: util/cuda/%.cu
$(NVCC) -c $< -o $@ $(NVCCFLAGS)
fastainv/fastainv.o: fastainv/fastainv.cpp
$(CXX) -c $< -o $@ $(CXXFLAGS)
clean:
-rm $(OBJS) $(LIB)
答案 0 :(得分:1)
所以你的意思是你想静态链接-lcudart,以便这些引用总是被OS加载器解析。
在最近的CUDA工具包中,nvcc接受标志
- cudart {none | shared | static}( - cudart)
共享/动态CUDA运行时库或静态CUDA运行时库。 此选项的允许值:'none','shared','static'。
所以也许你可以尝试在你的制作规则中添加--cudart static。