2013-06-26 23 views
2

我想這是一個比Qt和moc更多的GNU製造問題,但是在這裏。Qt和MOC的困境與一個簡單的製作

我有一個包含多個Q_OBJECTS一個目錄,我有一些簡單的代碼,收集所有這些,如

MOCS := $(shell grep -l Q_OBJECT $(HEADERS)) 

假設HEADERS是頭文件中的「當前位置」

集合

現在我想要做的是指定一個規則,它將調用Qt moc來構建.C文件,然後將其編譯到一個對象中。如何指定這樣的規則?

我的出發點是愚蠢的:

MOC_SOURCES := $(MOCS:%.h=%.C) 
MOC_OBJECTS := $(MOC_SOURCES:%.C=%.o) 

$(MOC_SOURCES) : $(MOCS) 
    @echo "Building Moc: [email protected] from $<" 
    $(MOC) $< -o [email protected] 

這是愚蠢的,因爲正在發生的事情是,$<第一頭部,所以所有的對象都是使用這個標題,而不是相關的頭文件編譯。

有沒有辦法清理這個,以便從正確的頭部構建正確的moc對象?

+0

只是出於好奇,你爲什麼這樣做,而不是讓'qmake'構建它適合你? – cmannett85

+0

@ cmannett85我必須承認,我沒有聽說過這個。然而,問題在於GUI組件是一個更大的庫的一小部分,它是使用gnu make構建的。 – Nim

回答

1

從每個$(MOC)組件生產各$(MOCS_SOURCES)組件,您可以使用static pattern rule,像這樣:

$(MOC_SOURCES) : %.C: %.h 
    @echo "Building Moc: [email protected] from $<" 
    $(MOC) $< -o [email protected] 

另一種常見的做法是使用隱規則,但有一個特定的由moc生成的C++文件的後綴。下面是我用的時候QMAKE是不是一種選擇:

%.moc.o: %.moc.cpp 
    $(CXXCOMPILE) $(QT_CPPFLAGS) $(QT_CXXFLAGS) -c $< -o [email protected] 

%.moc.cpp: %.h 
    $(MOC) $< -o [email protected] 
+0

非常感謝,後者的提示正是我所需要的! – Nim

1

我對QT或moc一無所知,但如果你所說的是moc是一個只需要一個頭文件並生成一個文件的工具,那麼你可以使用一個模式規則:

%.C : %.h 
     $(MOC) $< -o [email protected]