2015-11-03 97 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) 

背景信息