2012-10-18 30 views
2

實質上,我希望能夠將mma不是cmake中任何目標的一部分的頭文件與我不知道這些頭的文件名的額外難題組合在一起。在不知道它們的文件名的情況下在外部頭文件中使用cmake的automoc

實際項目相當複雜,是自動化構建系統的一部分。以下是一個簡單的例子。 考慮構建這樣一個項目:

的CMakeLists.txt
的src/lib目錄/ source.cpp
的src/lib中/的CMakeLists.txt
的src /包括包含在source.cpp/some_header.hpp#


內容主要的CMakeLists.txt的:SRC/LIB/C的

cmake_mimimum_required(VERSION 2.8.6) 
project("automoctest") 
add_subdirectory(src/lib) 



內容MakeLists.txt:

include_directories(${CMAKE_HOME_DIRECTORY}/src/include) 
find_package(Qt4 4.8 REQUIRED QtCore) 
include(UseQt4) 
include_directories(${CMAKE_CURRENT_BINARY_DIR}) 
add_library(foo SHARED source.cpp) 
target_link_libraries(foo ${QT_LIBRARIES}) 
set_target_properties(foo PROPERTIES AUTOMOC true) 



內部source.cpp文件some_header.hpp包括這樣的:

#include "some_header.hpp" 



問題:
文件some_header.hpp包括Q_OBJECT並且有一些信號,所以moc需要發揮它的魔力。但由於標題不在實際項目中,標題不會被嘲弄。我甚至不知道some_header.hpp的文件名,所以我不能專門添加它來模擬。顯然,即使源文件包含其中一個文件,AUTOMOC也不檢查include_directories是否爲可模擬文件。

我試過(不成功):在source.cpp

  • 使用的#include moc_some_header.cpp,因爲它是CMake的文檔中描述。這導致錯誤,其中cmake抱怨它找不到some_header {.h,.hpp,.hxx,.H}
  • 將CMAKE_AUTOMOC_RELAXED_MODE設置爲true。儘管從文檔不清楚這實際上做了什麼。無論如何,沒有任何區別。
  • 將AUTOMOC_MOC_OPTIONS設置爲-Isrc/include或-I/path/to/project/src/include或-I $ {CMAKE_HOME_DIRECTORY}/src/include
    不執行任何我能看到的操作。

關於AUTOMOC的好處是我不需要知道哪些文件實際上需要被模擬。在這種情況下,我需要知道所有可能包含Q_OBJECT的頭文件,這些頭文件都包含在我的源文件中。

有沒有辦法告訴AUTOMOC究竟在哪裏尋找可嘲諷的文件?

回答

0

您是否真的將AUTOMOC_MOC_OPTIONS設置爲-Isrc/include-I/path/to/myproject/src/include?前者可能不存在。


我一直使用MOC宏;它看起來像AUTOMOC是CMake內置的新東西。

我通常包括所有的頭創建庫或可執行文件時 - 即

add_library(foo SHARED source.cpp ../include/some_header.hpp) 

假設這將允許AUTOMOC工作。它會帶來額外的好處,使make按預期工作 - 當標題更改時重建庫。

如果你是真正無法將文件添加到時間提前add_library命令,那麼我認爲你必須寫一個函數的CMake內source.cpp搜索#include語句,找到這些文件,並搜尋他們Q_OBJECT 。如果它們匹配,將它們添加到一個變量 - 可能是EXTRA_MOCS。然後,add_library行變成

add_library(foo SHARED source.cpp ${EXTRA_MOCS}) 
+0

啊是的,對不起。我爲-I選項嘗試了幾條路徑。絕對,相對使用CMAKE_HOME_DIRECTORY ...沒有工作。 – ifschleife

+0

是的,將標題添加到庫顯式工作,但我不能這樣做。我自己(或類似的)想到了另一種解決方案,但自己掃描標題看起來很麻煩。我很驚訝,似乎沒有辦法告訴automoc也moc包含文件... – ifschleife

+2

你有沒有找到一種方法來實現這一目標?我在同一條船上,只是使用Qt5。 –

相關問題