2015-11-03 94 views
1

我不能將cmake-QT項目劃分爲dirs。如何將cmake項目移動到子目錄?

在根目錄,我有

cmake_minimum_required(VERSION 2.8) 
add_subdirectory(RSA) 
add_subdirectory(updater_app/states) 
add_subdirectory(updater_app) 

updater_app DIR我有個下面的代碼,並能正常工作:

project(Updater) 
cmake_minimum_required(VERSION 2.8) 

set(CMAKE_INCLUDE_CURRENT_DIR ON) 
set(CMAKE_AUTOMOC ON) 

find_package(Qt5Widgets) 
find_package(Qt5Quick) 

list(INSERT CMAKE_MODULE_PATH 0 "${PROJECT_SOURCE_DIR}/cmake") 
include_directories(${Qt5Widgets_INCLUDE_DIRS}) 
include_directories(${CMAKE_CURRENT_BINARY_DIR}) 
add_definitions(${Qt5Widgets_DEFINITIONS}) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}") 
qt5_generate_moc(main.cpp main.moc) 

set(HEADERS worker.h) 

set(SRC_LIST main.cpp worker.cpp) 

add_executable(Updater ${SRC_LIST} ${src_moc} ${HEADERS}) 
target_link_libraries(Updater Qt5::Widgets) 
target_link_libraries(Updater Qt5::Quick) 
target_link_libraries(Updater ${RSALIB}) 

但在另一個目錄updater_app/states(的病程凸出名稱類似的代碼和文件 - 不同)不起作用, 它給我一百萬個錯誤,例如:

error:left of '.append' must have class/struct/union 
type is 'int' 
error: C2664: 'bool QObject::setProperty(const char *,const QVariant &)' : cannot convert argument 2 from 'const char [5]' to 'const QVariant &' 
Reason: cannot convert from 'const char [5]' to 'const QVariant' 
Source or target has incomplete type 
error 

等等。當所有的文件與一個cMake文件在同一目錄中時 - 一切都很好。

請幫幫我任何人 - 如何將項目分爲子目錄?

+0

'find_package()'模塊通常會在CMake的緩存中存儲(如果它們已經被執行)。 [這裏](http://stackoverflow.com/questions/11680168))。所以你試圖切換'updater_app/states'和'updater_app'並從頭開始運行它(乾淨的二進制輸出目錄)?一般來說,我會將通用部分移動到您的主CMakeLists.txt中,例如發現Qt5只有一次。關於你的錯誤信息,這似乎是不同的頭版本的問題。你有多個安裝的QT版本?你使用哪種OS/CMake?看起來像Windows/VS。 – Florian

+0

謝謝你的評論!你給了我正確的答案 - 在分割文件夾之後,增加了幾個包括(qstringlost,qvariant)的nesecssery,並且鏈接的問題被更多的智能拆分到文件夾所限制,所以只有一個子項目依賴於其他子項目。 – Mira

+0

不客氣。我已將我的評論轉換爲答案,併爲子目錄拆分添加了一個示例。 – Florian

回答

0

find_package()模塊通常存儲在CMake的緩存中,如果它們已經被執行。

一旦某個調用成功,結果變量將被設置並存儲在緩存中,這樣就不會再有搜索。

因此,兩次調用所有東西都無濟於事,我建議將通用部分(如找到Qt5)移動到主要的CMakeLists.txt中。

關於您的錯誤消息,這看起來像衝突的函數或類聲明。這暗示是不同頭文件的問題。

我對你的項目結構的建議看起來 - 即使它不同於Qt的CMake Manual一點 - 是這樣的:

的CMakeLists.txt

cmake_minimum_required(VERSION 3.3) 

project(Updater CXX) 

set(CMAKE_INCLUDE_CURRENT_DIR ON) 
set(CMAKE_AUTOMOC ON) 

find_package(Qt5 REQUIRED COMPONENTS Widgets Quick) 

add_subdirectory(RSA) 
add_subdirectory(updater_app) 
add_subdirectory(updater_app/states) 

updater_app /的CMakeLists.txt

qt5_generate_moc(main.cpp main.moc) 

set(HEADERS worker.h) 
set(SRC_LIST main.cpp main.moc worker.cpp) 

add_executable(Updater ${SRC_LIST} ${HEADERS}) 
target_link_libraries(Updater Qt5::Widgets Qt5::Quick RSALIB) 

背景信息