需要使用demon网络来跑深度图和相机位姿,其github上有详细的build教程,如下图所示:
但是由于使用的cuda版本以及虚拟环境管理方式不太一样(我是用conda管理的虚拟环境,然后cuda版本是10.0),所以在make的时候连着遇到几个问题(其实就算版本和作者的一模一样,还是会出现这些错误,因为我也试过了。配深度学习环境真是太麻烦了。),在此按照遇到问题的顺序依次记录一下。
详情:
fatal error: tensorflow/core/framework/op_kernel.h: 没有那个文件或目录
#include "tensorflow/core/framework/op_kernel.h"
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
解决方法:链接
详情:
/home/jianping/anaconda3/envs/demon-env/lib/python3.5/site-packages/tensorflow/include/unsupported/Eigen/CXX11/../../../Eigen/Core:59:14: fatal error: math_functions.hpp: 没有那个文件或目录
#include
^~~~~~~~~~~~~~~~~~~~
compilation terminated.
CMake Error at lmbspecialops_generated_warp2d_cuda.cu.o.Release.cmake:220 (message):
Error generating
/home/jianping/workspace/demon/lmbspecialops/build/lib/CMakeFiles/lmbspecialops.dir//./lmbspecialops_generated_warp2d_cuda.cu.o
原因:
不同cuda版本,其某些文件存放的路径也不太一样。比如这里的math_functions.hpp文件,在cuda8.0下,其路径为:/usr/local/cuda-8.0/include/math_functions.hpp,而在cuda10.0里,其路径为:/usr/local/cuda-10.0/include/crt/math_functions.hpp。参考链接。
解决方法:
使用软链接,在终端执行命令sudo ln -s /usr/local/cuda/include/crt/math_functions.hpp /usr/local/cuda/include/math_functions.hpp即可。
详情:
/home/jianping/anaconda3/envs/demon-env/lib/python3.5/site-packages/tensorflow/include/tensorflow/core/platform/default/mutex.h:25:10: fatal error: nsync_cv.h: 没有那个文件或目录
#include "nsync_cv.h"
^~~~~~~~~~~~
compilation terminated.
CMake Error at lmbspecialops_generated_warp2d_cuda.cu.o.Release.cmake:220 (message):
Error generating
/home/jianping/workspace/demon/lmbspecialops/build/lib/CMakeFiles/lmbspecialops.dir//./lmbspecialops_generated_warp2d_cuda.cu.o
解决方法:
locate一下nsync_cv.h文件,可以发现它的路径是/home/jianping/anaconda3/envs/demon-env/lib/python3.5/site-packages/tensorflow/include/external/nsync/public/nsync_cv.h。而在第一个问题处,我们已经将tensorflow/include这个路径添加到cmakelists文件里了,也就是cmake是可以找到这个路径的,那么接下来的问题就是include时候路径没有告诉完整。方法就是,将tensorflow/core/platform/default/mutex.h里的
#include "nsync_cv.h" #include "nsync_mu.h"
改为:
#include "external/nsync/public/nsync_cv.h" #include "external/nsync/public/nsync_mu.h"
4. #error – unsupported GNU version! gcc versions later than 5 are not supported!
详情:
In file included from /usr/local/cuda/include/cuda_runtime.h:78:0,
from :0:
/usr/local/cuda/include/host_config.h:119:2: error: #error -- unsupported GNU version! gcc versions later than 5 are not supported!
#error -- unsupported GNU version! gcc versions later than 5 are not supported!
^~~~~
In file included from /usr/local/cuda/include/cuda_runtime.h:78:0,
from :0:
/usr/local/cuda/include/host_config.h:119:2: error: #error -- unsupported GNU version! gcc versions later than 5 are not supported!
#error -- unsupported GNU version! gcc versions later than 5 are not supported!
^~~~~
解决方法:链接
再make,就可以成功到100%了!make时候有个小tips,可以在最后添加参数-j来使用多线程make。比如make -j8就是使用8线程。
在执行cmake ..命令的时候,会很快速地输出一堆东西,没有明显的红色错误信息,如果你没有返回去仔细查看一下这一堆信息的话,很容易把它给忽略掉。而且问题还在于,如果你不管这个错误信息,直接继续编译下去的话,是可以成功编译好lmbspecialops的。但是在后面你使用tensorflow和这个包的时候,你还是会遇到这个错误的(亲身经历)。所以不将其解决也不是办法。报错信息如下:
-- Found PythonInterp: /home/jianping/anaconda3/envs/demon/bin/python (found version "3.5.6") Traceback (most recent call last): File "/home/jianping/anaconda3/envs/demon/lib/python3.5/site-packages/tensorflow/python/pywrap_tensorflow.py", line 58, infrom tensorflow.python.pywrap_tensorflow_internal import * File "/home/jianping/anaconda3/envs/demon/lib/python3.5/site-packages/tensorflow/python/pywrap_tensorflow_internal.py", line 28, in _pywrap_tensorflow_internal = swig_import_helper() File "/home/jianping/anaconda3/envs/demon/lib/python3.5/site-packages/tensorflow/python/pywrap_tensorflow_internal.py", line 24, in swig_import_helper _mod = imp.load_module('_pywrap_tensorflow_internal', fp, pathname, description) File "/home/jianping/anaconda3/envs/demon/lib/python3.5/imp.py", line 243, in load_module return load_dynamic(name, filename, file) File "/home/jianping/anaconda3/envs/demon/lib/python3.5/imp.py", line 343, in load_dynamic return _load(spec) importError: libcudnn.so.6: cannot open shared object file: No such file or directory
其实直接看这里的最后这行就可以了,意思是找不到libcudnn.so.6。这个文件到底代表着什么?这里的6,感觉是和某某的版本有关。其实就是字面意思,cudnn的版本。这段报错其实是我在cuda8.0环境下编译lmbspecialops报错的(上面一开始提到的cuda10.0是昨天的事了,然后当时给我报的错是libcudnn.so.8,后来修改了tensorflow版本什么的,弄得环境有点乱,于是我又重新建了一个和作者版本配置一样的虚拟环境,打算重新配环境)。这会儿我就很纳闷了,昨天用的cuda10.0,你给我报错libcudnn.so.8,今天换成cuda8.0,报错就变成了libcudnn.so.6。???(黑人问号)难不成我还要去试试cuda6.0?然后也许你还会给我报错libcudnn.so.4?(开玩笑的)。
其实这里的6和8,指的是cudnn的版本。由于作者并没有说明他使用的cudnn是什么版本,而cuda8.0既有cudnn6的,也有cudnn7的,然后7是比较新一些的。所以我当时安装好cuda8.0之后就直接下载了cudnn7版本的。而实际上,这里需要的是cudnn6。内鬼找到了,解决办法很简单,去cudnn官网下适用于cuda8.0的cudnn v6.0(2017年的,真的是有点古老了),如下图所示:
下好之后解压,使用这里头的文件去替换之前7版本的就可以了。如果不知道怎么替换,参考这里吧。修改好之后再次运行cmake ..的时候,就不会再出现这个错误了!
这个问题是编译好lmbspecialops要使用它的时候报错的。报错信息是:
'Cannot find lmbspecialops.so . Set the environment variable LMBSPECIALOPS_LIB to the path to lmbspecialops.so file') ValueError: Cannot find lmbspecialops.so . Set the environment variable LMBSPECIALOPS_LIB to the path to lmbspecialops.so file
找不到的这个文件在lmbspecialops目录下的/build/lib目录下。一开始我以为就是程序找不到so链接文件,于是尝试了很多方法,包括但不限于修改~/.bashrc文件、修改/etc/ld.so.conf文件然后sudo /sbin/ldconfig,甚至将该so文件拷贝到usr/lib和/lib路径下。但是,都无济于事。而实际上,这段报错信息是lmbspecialops.py文件里面的,该文件的第23~29行内容如下:
if 'LMBSPECIALOPS_LIB' in os.environ:
_lib_path = os.environ['LMBSPECIALOPS_LIB']
else: # try to find the lib in the build directory relative to this file
_lib_path = os.path.abspath(os.path.join(os.path.split(__file__)[0], '..', 'build', 'lib', 'lmbspecialops.so'))
if not os.path.isfile(_lib_path):
raise ValueError(
'Cannot find lmbspecialops.so . Set the environment variable LMBSPECIALOPS_LIB to the path to lmbspecialops.so file')
这里,os是python自带的一个包,os.environ可以用来获取与设置系统变量,一个比较好的讲解可以点击这里。上面的语句不难理解:如果系统变量中有定义了LMBSPECIALOPS_LIB这个变量,那么获取该变量值,然后检验其是否是需要的lmbspecialops.so文件;如果没有设置该变量,则自动构建lmbspecialops.so的文件路径。如果我们没有改变编译好的lmbspecialops的文件结构,那么就算我们没有设置LMBSPECIALOPS_LIB这个环境变量,自动构建的路径应该也是能找到lmbspecialops.so文件的。可是,它没找到。问题就出在,自动构建的相对路径…/build/lib/lmbspecialops.so中的…,在环境变量里头是不认的。所以这个自动构建路径根本就没用。那么还一个问题,我在前面不是试了很多方法去添加环境变量吗,为什么也没有用呢?因为这里作者又挖了个坑,一般我们添加环境变量都是到所需文件的路径而已,而作者这里,是要把文件名都加上!
上面已经把原因都说明了,所以解决方法就是,要么在添加名为LMBSPECIALOPS_LIB的环境变量时把文件名也加上,要么在文件内构建路径时,构建绝对路径而不是相对路径,这样就可以了。



