gcc编译时找不到标准库(由于gcc版本不同造成的dkms)

dkms动态内核模块支持,可以将位于内核资源树以外的模块自动编译到内核中,这对于nvidia这类私有驱动非常有用处,无需在更新内核之后重新安装驱动推荐在安装驱动之前,提前安装dkms包,或者使用包含nvidia-dkms的安装方式(如ubuntu中提供的nvidia-driver方式,或是PPA方式)提前安装好 dkms 包之后,在 使用.run方式安装nvidia驱动时,dkms会被自动检测到,提示是否使用dkms支持,也可以用 --dkms 参数显式要求如果之前没有提前安好dkms ,也可以在安装完驱动后安装dkms,然后手动执行,今天小编就来聊一聊关于gcc编译时找不到标准库?接下来我们就一起去研究一下吧!

gcc编译时找不到标准库(由于gcc版本不同造成的dkms)

gcc编译时找不到标准库

dkms动态内核模块支持,可以将位于内核资源树以外的模块自动编译到内核中,这对于nvidia这类私有驱动非常有用处,无需在更新内核之后重新安装驱动。推荐在安装驱动之前,提前安装dkms包,或者使用包含nvidia-dkms的安装方式(如ubuntu中提供的nvidia-driver方式,或是PPA方式)。提前安装好 dkms 包之后,在 使用.run方式安装nvidia驱动时,dkms会被自动检测到,提示是否使用dkms支持,也可以用 --dkms 参数显式要求。如果之前没有提前安好dkms ,也可以在安装完驱动后安装dkms,然后手动执行。

正常过程是 add,build,install ,可以用 status 来查看状态。最终正常结果是

nvidia,510.60.02, 5.3.0-28-generic,x86_64:installed

nvidia,510.60.02, 5.4.0-107-generic,x86_64:installed

(以上内容展示的是ubuntu18.04 环境下,包含nvidia模块的2个不同版本的内核)

dkms对模块进行编译和安装,必然需要编译环境的支持。但随着时间推移,由于内核版本和各种安全补丁等不断升级,很大几率出现编译系统内核的gcc版本和当前系统中gcc版本不同的情况,如果不采取一些措施就会执行失败。比如在UBUNTU 18.04.4下,内核版本是5.3.0-28, 编译内核使用的 gcc版本是 7.4.0-1ubuntu1~18.04.1, apt update 然后安装build-essentail ,系统中实际安装的gcc 版本是 7.5.0-3ubuntu1~18.04。 此时在使用run文件安装时就需要添加 --no-cc-version-check 参数来关闭cc版本检查,否则会安装失败。

以下为部分报错信息:

.....skipped.......

‘make -j4 NV_EXCLUDE_BUILD_MODULES='' KERNEL_UNAME=5.3.0-28-generic IGNORE_CC_MISMATCH='' modules...(bad exit status : 2 )

ERROR(dkms apport) :binary package for nvidia : 510.60.02 not found

error!...(skipped)......

cousult /var/lib/dkms/nvidia/510.60.02/build/make.log

......skipped.......

继续查看make.log文件

......skipped.......

*****failed CC version check . bailing out! *****

........for target 'cc_version_check' failed

make[2]: 'cc_version_check' Error 1

...skipped....

同时,在make.log文件中给出的解决方式有2个:

1:推荐使用于内核一样的cc版本

也就是说,安装7.4.0的gcc。然而,apt list gcc -a 查询后发现,候选的只有7.3.0,已安装版本是 7.4.0-1ubuntu2.3 。看着是7.4.0,然而在 gcc --version 查出来的版本是7.5.0 。(哪位神仙给指点一下?)

卸载gcc 7.5.0 手工编译gcc 7.4.0 么?克服这难度不如重装驱动了,一个弄不好就连带系统一起崩溃了。

推荐的方式行不通~

2,添个环境变量

增加 IGNORE_CC_MISMATCH =1 的环境变量就可以关掉编译器版本检查。接着提示说内核版本和模块用不同版本编译会有细微的差别,可能会有很难诊断出来的bug。

尝试了 export IGNORE_CC_MISMATCH=1 ,无效。添加在 profile里面,无效。添加在 bashrc里面,无效。

事实证明,环境变量方法可能是有作用的,然而我不知道怎么去做。

再次放弃~

再次研究了报错信息,好像是获得了一些启发。参数都是在命令里面写死了,怪不得环境变量无效。

依照提示,针对此处的dkms的编译参数配置文件是 dkms.conf,位于/var/lib/dkms/nvidia/510.60.02(这是个软连接,实际位置是 /usr/src/nvidia-510.60.02),

直接修改其中的内容,把MAKE[0]参数中的 IGNORE_CC_MISMATCH='' 改成 IGNORE_CC_MISMATCH='1'。

再次测试。build 通过。。。install 成功。status 检查。

nvidia,510.60.02, 5.3.0-28-generic,x86_64:installed (warning ! diff between built and installed module!)

状态确实是installed,但是后面的warning是什么情况?向上翻看build输出内容,发现如下提示:

good News !Module version 510.60.02 for nvidia.ko exactly matches what is already found in kernel 5.3.0-28-generic . DKMS will not replace this module 。

you may override by specifying --force 。

上面的warning怎么看也不能算是好消息啊。

依照上述所说,加上--force参数覆盖掉内核里面的模块(这模块是哪里来的呢?)再次build之前要先卸载掉warning模块,uninstall,然后 build --force,然后 再次install,status检查。

nvidia,510.60.02, 5.3.0-28-generic,x86_64:installed

OK,干净了。

查看 lsmod,查看modinfo nvidia ,一切正常。

到底dkms是否有效,还差一次大考。

apt update

apt upgrade -y

内核从5.3.0-28 更新到了 5.4.0-107 ,更新的时候 明确看到了dkms的编译过程。

重启,dkms status ,显示内容符合最终正常结果。

nvidia-smi 和nvidia-setting验证ok。

=========

最后总结:

1.linux环境中的软件版本相较windows要求更严格,细微差别都可能影响最终结果;

2.遇到问题,必须全方位查看各种log,单独的日志不一定能直指问题所在;

3.用bing搜索基本可以替代原来的google,度娘的搜索结果帮助效果不大。

4.linux中问题的解决方式会随着版本的更新而变化,一些老方法解决不了新问题。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页