【问题标题】:Qt/CMake difficulty with new source files新源文件的 Qt/CMake 困难
【发布时间】:2016-02-18 13:16:22
【问题描述】:

我使用 Qt 的方式是与 Qt 相关的文件位于单独的子目录 GUI 中,并且我使用的是 CMake 文件,其相关部分如下所示。基本上这个设置是有效的,但是当我添加一个新文件(类似于自己的小部件)时,新文件编译正常,但在链接阶段找不到新对象。我曾经删除 build 子目录,之后一切正常。所以,我的问题是:我对 CMake 有什么误解吗? (我怀疑这些症状是由一些缓存问题引起的)

  include_directories(${Qt5Widgets_INCLUDES} GUI/include main/include)

  add_definitions(${Qt5Widgets_DEFINITIONS})

  file(GLOB_RECURSE QOBJECT_HEADERS
    "GUI/include/*.h"
)
  file(GLOB_RECURSE QOBJECT_SOURCES
    "GUI/*.cpp"
)

QT5_WRAP_CPP(hdr_moc ${QOBJECT_HEADERS})

  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}  -std=c++11 -Wall")

add_executable(simGUI main/sim_GUI.cpp ${QOBJECT_SOURCES}
    ${hdr_moc})
# Use the Widgets module from Qt 5.
target_link_libraries(simGUI Qt5::Widgets)

【问题讨论】:

    标签: qt cmake static-linking


    【解决方案1】:

    来自 CMake 文档:

    我们不建议使用GLOB 从源代码树中收集源文件列表。如果在添加或删除源时没有 CMakeLists.txt 文件发生更改,则生成的构建系统无法知道何时要求 CMake 重新生成。

    典型的做法是手动列出所有文件。

    【讨论】:

    • 好的,谢谢。尽管我认为有办法注意到某些东西是新的。然而,奇怪的是新文件是 !compiled !但不是 !linked!。
    • @katang:因为这个缺点,我从来没有使用过GLOB,所以我不能说它是如何工作的。我们可以假设 CMake 基于 *.cpp 模式生成编译规则,但不能在链接步骤上应用类似的模式。
    • 后一个对我来说更奇怪。在编译阶段创建新对象之后,对象文件肯定是新的,并且由 CMake 系统创建。顺便说一句:我使用 GLOB 是因为我曾经忘记编辑源文件列表。看起来最好的办法是在添加/删除新文件后删除构建子目录。
    • @katang:对于小项目来说,去掉build dir可能已经足够了,但是当它变得越来越大时,你会失去编译的时间。
    猜你喜欢
    • 2012-03-10
    • 1970-01-01
    • 2015-06-10
    • 2017-11-30
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 2016-03-02
    相关资源
    最近更新 更多