linux系统操作过程中常见问题

问题1:执行 ./configure时出现报错信息:
checking for a bsd-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(make)... yes
checking whether make supports nested variables... yes
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking how to print strings... printf
checking for style of include used by make... gnu
checking for gcc... gcc
checking whether the c compiler works... no
configure: error: in `/home/jiajia/libuuid-1.0.3/libuuid-1.0.3':
configure: error: c compiler cannot create executables
see `config.log' for more details
很纳闷,往上翻了很多资料,总结一下:
情况一:export操作改变了cflags和libs的值
解决:将cflags和libs的值清空
export libs=
export cflags=
情况二:环境变量被修改
vi  ~/.bashrc
查看末尾处是否有类似如下信息:
export cc=arm-linux-gcc
export ar=arm-linux-ar
export ld=arm-linux-ld
export ranlib=arm-linux-ranlib
export strip=arm-linux-strip
解决:将上面信息删除或者注释掉
情况三:gcc编译环境没用配好
解决:
sudo apt-get install gcc libc6-dev
但是以上情况都不是我的情况,以上操作还是无济于事
情况四:软件包出问题,不能提供编译程序必须软件包的列表信息
解决:重装build-essential软件包
sudo apt purge binutils
sudo apt remove make
sudo apt autoremove
sudo apt install build-essential
问题终于解决了,./configure成功被执行
总结:一般第一种办法即可解决,或者是因为缺少一些支持库(前面的库没有编译好)。
问题2:编译模块命令make -c m=与make -c subdirs= 表示什么含义?
modules:
        $(make) -c $(kerneldir) m=$(pwd) modules
这句是makefile的规则:这里的$(make)就相当于make,-c 选项的作用是指将当前工作目录转移到你所指定的位置。“m=”选项的作用是,当用户需要以某个内核为基础编译一个外部模块的话,需要在make modules 命令中加入“m=dir”,程序会自动到你所指定的dir目录中查找模块源码,将其编译,生成ko文件。
新的内核模块编程中的make命令里有个m选项,如下: 
make -c /lib/modules/$(shell uname -r)/build m=$(pwd) modules
m=$(pwd) 意思是返回到当前目录继续读入、执行当前的makefile
这个m是kbuild的东西呢,还是make本来自己就有的东西呢? 
按理说,它是make的一个参数,应该是make的东西,但是make的doc里又找不到, 
如果是kbuild里的东西,它应该怎样来实现呢?经查证这个m是内核根目录下的makefile中使用的变量。 
m是makefile脚本中的一个变量(variable)
# use make m=dir to specify directory of external module to build# old syntax make ... subdirs=$pwd is still supported# setting the environment variable kbuild_extmod take precedenceifdef subdirskbuild_extmod ?= $(subdirs)endififdef m //如果没有定义或赋值m,此处m未定义(undefined)ifeq ($(origin m), command line) //如果定义了,此句用来判断m是否从命令行来kbuild_extmod := $(m)endifendif kernelrelease是在内核源码的顶层makefile中定义的一个变量,在第一次读取执行此makefile时,kernelrelease没有被定义, 所以make将读取执行else之后的内容。如果make的目标是clean,直接执行clean操作,然后结束。当make的目标为all时,-c $(kdir) 指明跳转到内核源码目录下读取那里的makefile;m=$(pwd) 表明然后返回到当前目录继续读入、执行当前的makefile。当从内核源码目录返回时,kernelrelease已被被定义,kbuild也被启动去解析kbuild语法的语句,make将继续读取else之前的内容。else之前的内容为kbuild语法的语句, 指明模块源码中各文件的依赖关系,以及要生成的目标模块名。mymodule-objs := file1.o file2.o表示mymoudule.o 由file1.o与file2.o 连接生成。obj-m := mymodule.o表示编译连接后将生成mymodule.o模块。
补充一点,$(make) -c $(kdir) m=$(pwd)与$(make) -c $(kdir) subdirs =$(pwd)的作用是等效的,后者是较老的使用方法。推荐使用m而不是subdirs,前者更明确。
通过以上比较可以看到,从makefile编写来看,在2.6内核下,内核模块编译不必定义复杂的cflags,而且模块中各文件依赖关系的表示简洁清晰。


海尔推“全空间保鲜” 能够实现恒温恒湿
中国联通正式发布VoLTE炫铃平台改造单一来源采购公示
TUV南德与中国计量院及晶澳签订三方战略合作协议
可调谐光滤波器:法布里-珀罗干涉仪介绍
过电压保护器有哪些应用
linux系统操作过程中常见问题
在经济下行压力较大背景下,2020年零售企业的路在何方?
华为P10全曝光:麒麟960+徕卡双摄像头 售价暴涨!
三极管原理简述及实例
国星光电发布了2018年年度报告,公司实现营业总收入36.26亿元
拆爆ModelS!看看特斯拉电池技术到底有多强
大众和卡塔尔达成协议,2022年投放电动汽车到首都公共交通网络
Energy Micro 公司推出节能环保微控制器入门套件
全球截止到目前为止已发布了253款5G设备
英特尔傲腾持久内存助力移动云应对严苛内存挑战
诺基亚8什么时候上市?诺基亚8最新消息:诺基亚8传言?诺基亚可能再次主宰移动行业!
美国为纠正5G毫米波频谱错误政策迈出了第一步
瑞芯微:今年将恢复传统淡旺季,下半年市场需求有望改善
使用NEC单片机保护您的设计
数字化转型升级,赋能奥迪威创新发展