如何将其他.o,.so,.a文件链接到当前的cuda compliation

时间:2016-02-24 08:39:05

标签: c++ c linux cuda centos

我想将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)

1 个答案:

答案 0 :(得分:1)

所以你的意思是你想静态链接-lcudart,以便这些引用总是被OS加载器解析。

在最近的CUDA工具包中,nvcc接受标志

  

- cudart {none | shared | static}( - cudart)
          共享/动态CUDA运行时库或静态CUDA运行时库。           此选项的允许值:'none','shared','static'。

所以也许你可以尝试在你的制作规则中添加--cudart static。