2015-10-13 45 views
2

我跑的是Android NDK讓使用ndk-build文件,該文件是與谷歌的makefile模板運行只是正常的GNU化妝。我正在運行它ndk-build -j8,我可以確認make命令行確實運行-j8
然而,編譯進行編譯我的源文件一個接一個,從來沒有運行clang++更多,一次一次。這並不總是這樣。就在幾天前,我使用了相同的確切腳本,它使用全部8個內核,速度更快。
什麼可能使牛羚突然不尊重-j8
有沒有辦法讓gnu製作關於此的任何解釋性信息?各種 - 調試選項似乎沒有談論它。GNU使-j8沒有運行的東西並行

從OSX 10.10.5運行,GNU的make版本是3.81

更新:如果我以前做ndk-build clean,我後立即做構建並在所有8個內核上運行。後續構建做了一天後返回到只使用1個核心

+1

我猜你有你'Makefile'一些奇怪的依賴。在看到它之前,我們無法回答你的問題。也許一些'-include'd文件正在造成一些混亂。 –

+0

順便說一句,你真的應該升級你的GNU'make'到4.1和/或使用[remake](http://bashdb.sourceforge.net/remake/)或'make -trace'來調試這些問題;嘗試一個'make clean'和/或'make distclean' –

+0

你的問題應該被關閉,因爲這裏沒有代碼顯示(你應該顯示你的'Makefile'),但是要求調試它並且更多關於[超級用戶](http://superuser.com/) –

回答

3

您可以檢查make實際上make是(使用which maketype make,看是否有涉及包裝腳本,函數或別名)。

這可能也是在發揮作用:Communicating options to a s submake

-j選項是一種特殊情況(見Parallel Execution)。如果你把它設置爲某個數值N和操作系統支持它(幾乎任何的UNIX系統;別人一般不會),父讓所有的子品牌將通信以確保只有N在運行作業他們之間的同一時間。請注意,標遞歸任何工作(見不是執行食譜)不計入總的工作(否則,我們可以得到N子使運行,並留下任何實際工作沒有插槽!)

和有關你:

如果您的操作系統不支持上述通信,然後-j 1總是投入MAKEFLAGS,而不是您指定的值。這是因爲如果將-j選項傳遞給子作品,則可以獲得比您所需的更多並行作業。如果你給-j沒有數字參數,意味着儘可能多的並行運行,這是傳遞下來的,因爲多個無窮大不超過一個。

+0

沒有任何子畫面,我只看到一個製作過程 – shoosh

+0

@shoosh確保它不是你的'make',創建一個虛擬的makefile,其中有一堆目標只是'echo'語句並執行'make all - - 工作= 16'。看我的[問題](http://stackoverflow.com/q/37734959/4784683) – Adrian

1

只是猜測:

  1. 在make文件搜索一個.NOTPARALLEL僞目標。它可以防止gnu從平行建造。
  2. 你有-l集,是負載高於?然後讓一次不會啓動多個工作。
  3. 你確定,在重建時有合適的東西要建立嗎?當然,make只會並行化任務,它知道彼此獨立
1

上面的答案給出了與您的問題有關的問題的已知鏈接。

不知道更多關於你的設置,我只能猜測:

也許,不知何故,運行構建腳本是影響MAKEFLAGS。

您可以嘗試將作業數量直接傳遞給ndk-build腳本。編輯您的NDK,構建腳本,像這樣:

$GNUMAKE -j8 -f $YourProgramDir/.../build-local.mk "[email protected]"

相關問題