大部分是CUDA11.1和Eigen环境的冲突
错误一:未找到 math_functions.hpp
原本的cuda/include里面没有这个hpp文件,然后我在cuda11.1文件夹里面找到了
方法一
创建一个符号链接来cuda/include/math_functions.hpp修复cuda/include/crt/math_functions.hpp该问题:
ln -s /usr/local/cuda_11.1/include/crt/math_functions.hpp /usr/local/cuda/include/math_functions.hpp
哦,对不要忘了给文件夹的cmakelist.txt的文件里加上这两句
“
find_package(CUDA REQUIRED)
include_directories(/usr/local/cuda/include)
”
这个加是得递归地去加,比如我在
Multi-Object-NeRF文件夹中搞build.sh里面含子目录的make,和当前目录的make,需要把子目录的make加上这些语句。
比如我加了个core子文件夹的make,我就需要在如下文件夹的cmakelist里面加东西
/Multi-Object-NeRF/Core
方法二
"
find_package(CUDA REQUIRED)
include_directories(/usr/local/cuda-11.1/targets/x86_64-linux/include)
include_directories(/usr/local/cuda-11.1/targets/x86_64-linux/include/crt)
"
Cmakelist直接加这个
错误二: no suitable constructor exists to convert from “float” to “Eigen::half
/usr/local/include/eigen3/Eigen/src/Core/arch/CUDA/Half.h(612): error: no suitable constructor exists to convert from “float” to “Eigen::half”
对应代码直接全注掉。
// device EIGEN_STRONG_INLINE Eigen::half __shfl_xor(Eigen::half var, int laneMask, int width=warpSize) {
// return static_castEigen::half(__shfl_xor(static_cast(var), laneMask, width));
//}
错误三:Eigen::half’ has no member named ‘x’
报了一堆没定义之类的错误。看了一下全是eigen,cuda目录下的。直觉的话感觉是eigen版本的问题。
于是卸了原来包管理器安装的最新版本eigen3.3.7
sudo apt-get remove libeigen3-dev
在Eigen官网下载了3.4.0,解压并替换原来/usr/local/include/eigen3的所有内容。
解决了。
错误四:
nerf_model.cu(1988): error: namespace “cv” has no member “imwrite”
#include<opencv2/imgproc/imgproc_c.h>
#include <opencv2/highgui/highgui_c.h>
加上这两个库即可
加上后发现还有一个文件疯狂报错
Multi-Object-NeRF/Core/src/nerf_data.cu(177): error: namespace “cv” has no member “IMREAD_UNCHANGED”
Multi-Object-NeRF/Core/src/nerf_data.cu(194): error: namespace “cv” has no member “imread”
Multi-Object-NeRF/Core/src/nerf_data.cu(194): error: namespace “cv” has no member “IMREAD_UNCHANGED”
代码片段中包含的头文件“opencv2/imgproc/imgproc_c.h”和“opencv2/highgui/highgui_c.h”是 OpenCV 旧 C 接口的一部分,并且不声明“imread”函数。 该函数是 C++ 接口的一部分。
要修复该错误,您应该包含包含“imread”定义的相应 C++ 头文件。 如果您使用 OpenCV 4.x 或更高版本,则应包括:
opencv2/opencv.hpp
,这是包含 OpenCV 所有模块的主包含文件,或者opencv2/imgcodecs.hpp
,这是包含图像编解码器的特定模块(包括imread
)。
所以将这个文件的头文件换成opencv2/opencv.hpp,opencv2/imgcodecs.hpp即可
错误五:
error: ‘CV_LOAD_IMAGE_UNCHANGED’ was not declared in this scope
66 | im = cv::imread(strDataset+“/”+vstrImageFilenames[ni],CV_LOAD_IMAGE_UNCHANGED);
CV_LOAD_IMAGE_UNCHANGED换成cv::IMREAD_UNCHANGED