【问题标题】:Makefile to build a cuda .so file (shared library)Makefile 构建一个 cuda .so 文件(共享库)
【发布时间】: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


【解决方案1】:

从另一个来源找到解决方案以解决 Makefile 中的问题,并且 .so 文件现在可以正常工作。以下是正确的 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=--compiler-options -fPIC
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/add_number

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

# This will achieve the same thing!
# $(OUT): $(OBJ)
#   $(CC) $(LDFLAGS) -shared -Wl,--export-dynamic $(LIBRARIES) -o $@ $^


default: $(OUT)

$(OUT): $(OBJ)
    $(CC) $(LDFLAGS) -shared -Wl,--export-dynamic $(OBJ) $(LIBRARIES) -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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 2012-12-28
    相关资源
    最近更新 更多