問題1:執(zhí)行 ./configure時出現(xiàn)報錯信息:
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
很納悶,往上翻了很多資料,總結(jié)一下:
情況一:export操作改變了CFLAGS和LIBS的值
解決:將CFLAGS和LIBS的值清空
export LIBS=
export CFLAGS=
情況二:環(huán)境變量被修改
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編譯環(huán)境沒用配好
解決:
sudo apt-get install gcc libc6-dev
但是以上情況都不是我的情況,以上操作還是無濟(jì)于事
情況四:軟件包出問題,不能提供編譯程序必須軟件包的列表信息
解決:重裝build-essential軟件包
sudo apt purge binutils
sudo apt remove make
sudo apt autoremove
sudo apt install build-essential
問題終于解決了,./configure成功被執(zhí)行
總結(jié):一般第一種辦法即可解決,或者是因為缺少一些支持庫(前面的庫沒有編譯好)。
問題2:編譯模塊命令make -C M=與make -C SUBDIRS=?表示什么含義?
modules:
????????$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
這句是Makefile的規(guī)則:這里的$(MAKE)就相當(dāng)于make,-C?選項的作用是指將當(dāng)前工作目錄轉(zhuǎn)移到你所指定的位置。“M=”選項的作用是,當(dāng)用戶需要以某個內(nèi)核為基礎(chǔ)編譯一個外部模塊的話,需要在make modules?命令中加入“M=dir”,程序會自動到你所指定的dir目錄中查找模塊源碼,將其編譯,生成KO文件。
新的內(nèi)核模塊編程中的make命令里有個M選項,如下:?
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
M=$(PWD) 意思是返回到當(dāng)前目錄繼續(xù)讀入、執(zhí)行當(dāng)前的Makefile?
這個M是kbuild的東西呢,還是make本來自己就有的東西呢??
按理說,它是make的一個參數(shù),應(yīng)該是make的東西,但是make的doc里又找不到,?
如果是kbuild里的東西,它應(yīng)該怎樣來實現(xiàn)呢?經(jīng)查證這個M是內(nèi)核根目錄下的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 precedence ifdef SUBDIRS KBUILD_EXTMOD ?= $(SUBDIRS) endif ifdef M //如果沒有定義或賦值M,此處M未定義(undefined) ifeq ("$(origin M)", "command line") //如果定義了,此句用來判斷M是否從命令行來 KBUILD_EXTMOD := $(M) endif endif
KERNELRELEASE是在內(nèi)核源碼的頂層Makefile中定義的一個變量,在第一次讀取執(zhí)行此Makefile時,KERNELRELEASE沒有被定義, 所以make將讀取執(zhí)行else之后的內(nèi)容。如果make的目標(biāo)是clean,直接執(zhí)行clean操作,然后結(jié)束。當(dāng)make的目標(biāo)為all時,-C $(KDIR) 指明跳轉(zhuǎn)到內(nèi)核源碼目錄下讀取那里的Makefile;M=$(PWD) 表明然后返回到當(dāng)前目錄繼續(xù)讀入、執(zhí)行當(dāng)前的Makefile。當(dāng)從內(nèi)核源碼目錄返回時,KERNELRELEASE已被被定義,kbuild也被啟動去解析kbuild語法的語句,make將繼續(xù)讀取else之前的內(nèi)容。else之前的內(nèi)容為kbuild語法的語句, 指明模塊源碼中各文件的依賴關(guān)系,以及要生成的目標(biāo)模塊名。mymodule-objs := file1.o file2.o表示mymoudule.o 由file1.o與file2.o 連接生成。obj-m := mymodule.o表示編譯連接后將生成mymodule.o模塊。
補(bǔ)充一點,"$(MAKE) -C $(KDIR) M=$(PWD)"與"$(MAKE) -C $(KDIR) SUBDIRS =$(PWD)"的作用是等效的,后者是較老的使用方法。推薦使用M而不是SUBDIRS,前者更明確。
通過以上比較可以看到,從Makefile編寫來看,在2.6內(nèi)核下,內(nèi)核模塊編譯不必定義復(fù)雜的CFLAGS,而且模塊中各文件依賴關(guān)系的表示簡潔清晰。
編輯:黃飛
?
評論
查看更多