Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt/CMake难以使用新的源文件_Qt_Cmake_Static Linking - Fatal编程技术网

Qt/CMake难以使用新的源文件

Qt/CMake难以使用新的源文件,qt,cmake,static-linking,Qt,Cmake,Static Linking,我使用Qt的方式是,Qt相关文件位于单独的子目录GUI,我使用的是CMake文件,其相关部分如下所示。基本上这种设置是有效的,但是当我添加一个新文件(类似于自己的小部件)时,新文件可以编译,但是在链接阶段找不到新对象。我过去常常删除build子目录,然后一切正常。那么,我的问题是:我是否在CMake上犯了什么错误?(我怀疑症状是由缓存问题引起的) 从CMake文档: 我们不建议使用GLOB从源代码树中收集源文件列表。如果在添加或删除源时没有更改CMakeLists.txt文件,则生成的生成系统无

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

从CMake文档:

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


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

好的,谢谢。尽管我认为有很多方法可以让你注意到一些新事物。然而,奇怪的是,新文件是!编译!但不是!链接@加藤:由于这个缺点,我从未使用过
GLOB
,所以我不能说它是如何工作的。我们可以假设CMake根据
*.cpp
模式生成编译规则,但不能在链接步骤上应用类似的模式。后一种模式对我来说更奇怪。在编译阶段创建新对象之后,对象文件肯定是新的,并且是由CMake系统创建的。顺便说一句:我使用GLOB是因为我曾经忘记编辑源文件列表。看起来最好的办法是在添加/删除新文件后删除build子目录。@katang:删除小型项目的build dir可能已经足够了,但当它变得越来越大时,您将失去编译时间。
  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)