解决bug: .cpython-37m-x86_64-linux-gnu.so: undefined symbol:
时间:2023年1月23日
一. 问题
用python下pytorch编写cuda算子时,在执行setup.py时,报错:
.cpython-37m-x86_64-linux-gnu.so: undefined symbol: 后面是一段乱码
二.解决方法一
setup.py中,setup()函数的ext_modules参数中的sources参数中,用到的文件要包含全。
setup(
name='',
version='',
author='',
packages=find_packages(),
ext_modules=CUDAExtension(
name='',
# 就是这个source参数,包含的文件要写全,包含.cpp和.cu文件即可,.h文件不用加。
source=['function_cpu.cpp','function_cuda.cu','vision.cpp'],
define_macros=define_macros,
extra_compile_args={
'cxx': [],
'nvcc': [
"-DCUDA_HAS_FP16=1",
'-D__CUDA_NO_HALF_OPERATORS__',
'-D__CUDA_NO_HALF_CONVERSIONS__',
'-D__CUDA_NO_HALF2_OPERATORS__',
]
)
)
三.解决方法二
使用PYBIND11_MODULE(TORCH_EXTENSION_NAME, m)粘合函数的时候,不能将多个不同函数接口写在同一个PYBIND11_MODULE()中。这一点我也不是太理解,做个记录,供以后思考。下面的例子是错误的示范,如果像下面这样写,会报错。
#include "fucntion1.h"
#include "function2.h"
PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) {
m.def("function1", &function1, "1111");
m.def("function2", &function2, "2222");
}
解决方法:2个算子的PYBIND11_MODULE()分开写,各自写在各自的函数中。
PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) {
m.def("function1", &function1, "1111");}写在fucntion1.h中
PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) {
m.def("function2", &function2, "2222");}写在function2.h中