2016-01-24 34 views
0

我的Makefile如下所示:讓-j作品,但-jN不工作

test: 
    make clean 
    make test2 
test2: CXX=g++ 
test2: all 

CPP_FILES := $(wildcard tmp/*.cpp) 
OBJ := $(CPP_FILES:.cpp=.o) 

all: ${OBJ} 
    ${CXX} ${OBJ} ${LIB_PATH} ${LIBS} ${CXX_FLAGS} -o output.exe 

%.o: %.cpp 
    ${CXX} ${CXX_FLAGS} ${INCLUDE_PATH} -c $< -o [email protected] 

所有.o文件可以(也應該)並行構建。如果我執行「make -j」,這是行得通的,但如果我通過「make -j4」將進程數量限制到某個固定數量(例如4),則失敗。這將導致以下消息:

make[1]: warning: jobserver unavailable: using -j1. Add `+' to parent make rule. 

有人能請我指出我的錯誤嗎?爲什麼「make -j」工作,而「make -j4」提供了這個錯誤信息?

謝謝!

+0

你用的是什麼'make'?不同的功能有不同的實現。另外,你說你正在用'-j4'運行這個,但是錯誤消息說了一些關於'-j1'的東西。 – Cubic

+1

千萬不要從make調用make,使用'$(MAKE)'或者其他一些魔術字符串。 –

+0

「魔術字符串」正好是'$(MAKE)'或'$ {MAKE}'(它們完全相同)。或者你可以在配方前添加「+」字符。信息在這裏:http://www.gnu.org/software/make/manual/html_node/MAKE-Variable.html然而,由於其他原因,你應該總是使用'$(MAKE)'或'$ {MAKE}'。 – MadScientist

回答

2

請閱讀documentation以瞭解GNU make中的遞歸調用。實質上,您需要撥打$(MAKE)${MAKE}而不是簡單的make,或者至少在配方中加上+的前綴,以便子版本可以正確地與父版本進行通信。當你要求工作控制時,這是特別有用的。

相關問題