写在前面的话:这是一篇日记,不是经验也不是教程。大概除了我,没人能感同身受了。
第一天:
我在tensorflow环境下使用gcc编译一个c文件时,报了这个错误。网上有相关的讨论:github讨论,不过好像问题并没有解决。
开始我使用了ubuntu16自带的gcc5,怀疑是编译器的问题,就又装回了gcc4.8.5和g++4.8.5,但是问题还是没有得到解决。
于是我(不,是我男朋友)猜测,是tensorflow版本的问题,他就给我搞到了tensorflowv1.10. 他的问题就是这么解决的。
当然,也没有解决。
至此,我的电脑环境是:
ubuntu16.04 + tensorflowv1.10 + gcc4.8.5 + cuda9.0
第二天:
排查了一下,我猜,大概是一个叫Eigen的包,和cuda不兼容。
我开始以为是cuda9.0不能用,需要装回cuda8.0. 由于我的机器一直是8和9都有,替换的时候直接修改软连接。我改了软连接之后发现tensorflow又不能运行了。
本来打算把tf装回到1.4版本,然后实验室的网速实在太渣,遂放弃,又把软连接链回了cuda9.0
然后我就发现不对了:当我输入nvcc --version时,显示的一直都是cuda8.0.
咦,我明明装回9.0了呀,反复删改,依然是8.0,绝望。
nvcc是cuda路径下bin文件夹里的一个可执行文件,如果有这个文件,那么就可以在终端执行nvcc命令。虽然我不懂操作系统,(是的,大学的操作系统课都白上了),但大概意思应该是,我把bin这个文件夹添加到系统某环境变量里,这样我就可以把这些文件直接当成命令执行了。
于是我猜测,一定是有一个地方的环境变量依然是cuda8.0的路径,我切换的过程中根本就没改过。所以,跟Eigen冲突的cuda版本应该是cuda8,而不是cuda9.
然而我根本就不知道到底是哪个,干脆,cuda9.0卸掉,cuda软链接删掉。
这时候再输入nvcc --version,还是cuda8.0。这就看出毛病了,明明我已经把cuda卸掉了,怎么还可以输出cuda版本的呢?
于是再次,卸掉cuda8.0,重头开始安装cuda9.0. 具体安装过程可以参考我的另一篇文章:ubuntu16.04上cuda安装、卸载和替换
完成安装后,需要改的有三个地方,~/.bashrc, ~/etc/profile, /etc/ld.so.conf.d/cuda.conf,第一个文件没毛病,环境变量都是cuda的路径;第二个和第三个就不那么对了,路径都是cuda8.0的。所以,问题在这里了。
可能你会问我,干嘛不从一开始就修改这两个文件,笨不笨傻不傻啦。
Ծ‸Ծ我之前不知道这两个也要改。我也是在安装完cuda以后,终端的完成提示告诉我的。
这一段是为了首尾呼应一下。写在后面的话就是,我还是不知道别人的机器出现了这个问题怎么解决,但是,我可以告诉你,很大概率是由于cuda和Eigen版本造成的。升级一下Eigen版本(哦怎么升级我也不知道),或者cuda,可能就可以解决了。如果还是解决不了, 那就要具体问题具体分析了。当然,遇到我这种奇葩情况,也不是那么容易的。