【问题标题】:How to move cmake project to subdirectories?如何将 cmake 项目移动到子目录?
【发布时间】:2015-11-03 13:57:16
【问题描述】:

我不能将 cmake-QT 项目分成目录。

在根目录中我有

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

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 文件位于同一个目录时 - 一切都很好。

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

【问题讨论】:

  • find_package() 模块通常会存储在 CMake 的缓存中,如果它们已经被执行(参见例如here)。那么您是否尝试过切换updater_app/states 和updater_app 并从头开始运行它(干净的二进制输出目录)?一般来说,我会将常用部分移动到您的主要CMakeLists.txt,例如发现 Qt5 只有一次。关于您的错误消息,这似乎是不同标头版本的问题。您是否安装了多个 QT 版本?您使用哪种操作系统/CMake?看起来像 Windows/VS。
  • 感谢您的评论!你给了我正确的答案 - 在划分到文件夹之后,添加一些包含 (qstringlost, qvariant) 是必要的,并且链接问题是通过更智能地拆分到文件夹来解决的,所以只有一个子项目依赖于另一个。
  • 不客气。我已经将我的评论变成了答案,并添加了一个子目录拆分示例。

标签: c++ qt cmake


【解决方案1】:

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)

背景信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多