【发布时间】:2020-06-17 08:30:02
【问题描述】:
我使用以下 Makefile 来生成 my_kernel.so 文件。 kernel.cuh 只包含一个函数声明:
void call_kernel(float *flattened_arr, float *out_arr_2, const int x_size, const int y_size, const int kernal_width);
但是,当从另一个程序调用“call_kernel”函数时,出现未定义函数“call_kernel”的错误。
我的问题是:这些行生成 .o 文件和 .so 文件是否正确?
$(OUT): $(OBJ)
$(CC) $(LDFLAGS) -shared $(LIBRARIES) -fpic -o $@
$(ODIR)/%.o: $(SDIR)/%.cu $(DEPS)
$(NVCC) $(NVCC_FLAGS) $(INCLUDES) -c $< -o $@
这是整个 Makefile:
CC=g++-8
DEBUG=no
ifeq ($(DEBUG),yes)
CXXFLAGS=-Wall -g
LDFLAGS=-Wall -g
else
CXXFLAGS=-Wall -g
LDFLAGS=-Wall -g
endif
NVCC=nvcc
NVCC_FLAGS=
NVCC_LIBS=
INCPATH=inc
SRCPATH=src
OBJPATH=obj
LIBPATH=lib
# CUDA directory:
CUDA_INC = /usr/include
CUDA_LIB = /usr/lib/x86_64-linux-gnu
DIR=/home/lee/Downloads/my_project
IDIR=$(DIR)/inc
_DEPS = kernel.cuh
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
SDIR=$(DIR)/src
_SRC = kernel.cu
SRC = $(patsubst %,$(SDIR)/%,$(_SRC))
ODIR=$(DIR)/obj
_OBJ = kernel.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
OUT=$(DIR)/lib/libmy_kernel.so
INCLUDES=-I$(CUDA_INC) -I$(IDIR)
LIBRARIES=-L$(CUDA_LIB) -lcudart_static -L$(CUDA_LIB) -lcudadevrt
default: $(OUT)
$(OUT): $(OBJ)
$(CC) $(LDFLAGS) -shared $(LIBRARIES) -fpic -o $@
$(ODIR)/%.o: $(SDIR)/%.cu $(DEPS)
$(NVCC) $(NVCC_FLAGS) $(INCLUDES) -c $< -o $@
.PHONY: clean cleanall
clean:
rm -f $(ODIR)/*.o
cleanall: clean
rm -f $(OUT)
非常感谢
【问题讨论】:
-
这 99% 的可能性是 C++ 与 C 链接问题。
-
建议的解决方案不能解决我的问题。我用 c++ 而不是 c 编写了所有内容。
-
在 makefile 中找到问题的修复:
NVCC_FLAGS=--compiler-options -fPIC和$(OUT): $(OBJ) $(CC) $(LDFLAGS) -shared -Wl,--export-dynamic $(OBJ) $(LIBRARIES) -o $@
标签: c++ makefile cuda shared-libraries .so