如何将cmake项目移动到子目录?

时间:2015-11-03 13:57:16

标签: c++ qt cmake

我不能将cmake-QT项目划分为dirs。

在根目录中我有

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

updater_app目录中我有以下代码,它运行正常:

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(couse proj名称和文件 - 不同)中的类似代码不起作用, 它给了我一百万个错误,例如:

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文件时 - 一切都很好。

请帮助我任何人 - 如何将项目划分为子目录?

1 个答案:

答案 0 :(得分: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)

背景资料