warning: jobserver unavailable: using -j1. Add `+' to parent make rule問題怎麼解決

   最近在整windows 下的gcc 工具鏈編譯,發現bat 調用make -j4 會有如下警告

warning: jobserver unavailable: using -j1. Add `+' to parent make rule,以爲是windows 下make 不支持多核編譯的原因,但是今天我把同一份代碼放到ubuntu下 編譯,一樣的警告,並且ubuntu 編譯別的Linux code 是沒有問題的,搜索網絡文章,衆說紛紜。

不過有人說是Makefile 寫的不合理,依賴比較散亂,導致make 沒法多進程編譯?我覺得這個有道理啊。

比如說上層模塊是a,有三個子模塊b, c, d
報錯是在生成a的目標文件時缺少b的目標文件,而在報錯後編譯才進入b的目錄編譯b模塊。
貌似是有個make子進程專門負責生成a目標文件,其他進程編譯子模塊b,c,d。本來應該是
b, c, d都編譯完了,再生成a。現在成了b,c, d還沒編譯,就執行了生成a的規則。

      那些說把make 替換爲$(MAKE)可以解決的確認是不可行的,這個問題更深層次的原因,後面我一定要找到。

      經過分析代碼,覺得有如下可能:

在父目錄的Makefile中export出變量,比如export CFLAGS
在父目錄的Makefile中make -C child_dir 就能去尋找子目錄中的Makefile並進行編譯
make -j4的時候向子Makefile編譯的時候出現問題 
make[1]: warning: jobserver unavailable: using -j1. Add `+’ to parent make rule. 
因爲子的Makefile中沒有make命令,只有${CC}命令,此時make不能實現多線程編譯。 
解決的辦法是在編譯這個子Makefile的時候使用+make -C child_dir

      的確,子目錄沒再出現過make 了,如果不存在子目錄的話那就真的不會出現這種情況。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章