2011-09-09 44 views
2

我已經在我的項目,叫做Core.h頭,我作爲預編譯頭使用:在Linux上預編譯的頭警告(太短是一個PCH文件)

$(CXX) $(CXX_CFLAGS) -x c++-header Core.h 

哪創建一個名爲Core.h.gch的文件

*#include "Core.h"是模塊中每個源文件的第一個指令。

在OS X上,它工作正常 - 我的項目編譯很好&編譯速度非常快。

在Linux但是,我的100多個文件7給出以下警告:

警告:Core.h.gch:太短,PCH文件

就像所有其他源文件,#include "Core.h"是這些文件的第一行。

有沒有人遇到過這個?可能的原因?爲什麼只有幾個包含PCH的文件纔會發出警告?

我在Linux上使用gcc版本4.1.2,在OSX上使用4.2.1

謝謝!

編輯:

這裏基本上是我如何構建庫:

.PHONY: all 
all: $(MY_PCH) MYLIB.so MYLIB.a 

MYLIB.so: $(MY_PCH) $(MY_OBJECTS) 
    $(CXX) $(MY_OBJECTS) $(CXX_LDFLAGS) -o [email protected] 

MYLIB.a: $(MY_PCH) $(MY_OBJECTS) 
    $(AR) $(ARFLAGS) [email protected] $(MY_OBJECTS) 

$(MY_PCH): 
    $(CXX) $(CXX_CFLAGS) -x c++-header Core.h 

回答

3

您使用的是並行make?可能g ++正在嘗試讀取.gch文件,而另一個實例正在寫入該文件。

+0

我使-j8,因此有8個線程。但即使沒有-j8,我仍然會收到警告。 – zedxz

+1

@zedxz:好的,這是你的問題。 makefile並不表示其他對象文件依賴於預編譯頭,因此它會嘗試與預編譯頭並行地構建它們,並且您有競爭條件。使用make的依賴關係規則強制在需要它的編譯單元之前編譯預編譯頭文件。 –

+0

絕對正確。將PCH添加爲對象而不是庫可以修復競爭條件。非常感謝你! – zedxz