1. 程式人生 > >linux gcc編譯器誤用-MM導致出現linker input file unused because linking not done

linux gcc編譯器誤用-MM導致出現linker input file unused because linking not done

背景

昨晚深夜,音視訊群有網友發訊息給我,反饋我寫的Makefile模板工程有一個bug,輸入make之後,提示:linker input file unused because linking not done,並且沒有生成a.out檔案。
畢竟是自己一直維護的程式碼,出現bug就修正。

解決

錯誤詳細資訊如下:

g++: warning: ../build/main/main.o: linker input file unused because linking not done
g++: warning: ../build/bar/libbar.a: linker input file
unused because linking not done g++: warning: ../build/foo/libfoo.a: linker input file unused because linking not done

初步看不出問題,開啟編譯命令列列印資訊,結果如下:

g++ -Wall -Wfatal-errors -MM -g  -I../include/ ../build/main/main.o -o ../bin/a.out ../build/bar/libbar.a ../build/foo/libfoo.a
g++: warning: ../build/main/main.o: linker input file
unused because linking not done g++: warning: ../build/bar/libbar.a: linker input file unused because linking not done g++: warning: ../build/foo/libfoo.a: linker input file unused because linking not done

好像也沒問題(注意!實際已經出現問題了,只是未發現),看一下.o檔案格式:

file ../build/main/main.o
../build/main/main.o: ASCII text

竟然是ASCII文字,有點異常,檢視其內容:

cat ../build/main/main.o
main.o: main.cpp ../include/foo.h ../include/bar.h ../include/crc.h \
 hello.h

從內容上,與生成的依賴檔案是一樣的。繼續分析,發現在config.mk檔案的CFLAGS = -Wall -Wfatal-errors -MM有問題。先看生成依賴檔案的指令碼關鍵的語句:

_depend: $(obj).depend

        $(CC)  $(CFLAGS) -E -MQ $(_obj)$$g $$f >> [email protected] ; 

為了生成依賴檔案(.d檔案),需要使用-MM,因此才有CFLAGS定義。但是CFLAGS同樣也用於編譯原始碼檔案,但編譯原始碼是不能使用-MM的,混用之後,得到的.o檔案實際上就是依賴檔案,具體見上內容。
知道問題後,修改就簡單了,在CFLAGS去掉-MM,在生成依賴檔案的指令碼的CFLAGS前新增-MM即可。

小結

這次Bug是沒有對編譯選項做全面檢查導致了。修正的版本已提交github。地址:https://github.com/latelee/Makefile_templet,具體在:https://github.com/latelee/Makefile_templet/tree/master/mult_dir_project

李遲 2018.8.31 晚