繁体   English   中英

QtCreator CMake项目自动完成并非总是有效吗?

[英]QtCreator CMake Project Auto-Complete Not Always Working?

我一直在从事一个使用cmake作为构建系统的项目,并且在QtCreator中工作得很好。 有子项目(一些与Qt相关的项目,其他仅与纯c ++有关的项目),直到现在,所有子项目都能够找到头文件,并因此提供自动完成功能。

在某个时候,我添加了一个Qt项目,并注意到编辑器未找到我的Qt项目标头。 真正奇怪的是,它们可以通过QtCreator'Build-> Build All'编译并运行良好。 几乎就像QtCreator找不到自动完成一样。

我环顾四周,在早期版本的QtCreator中查找Qt类时用户遇到问题,但是在查找其定义的头文件时似乎没有问题。

我将一个简化的“项目”放在一起,并添加了两个新的Qt Widget Application项目,其主窗口是QDialog而不是QMainWindow。 我将以下CMakeLists.txt文件添加到每个项目:

My Standard CMake File For Qt

cmake_minimum_required(VERSION 3.0.2)
project("FooProj")
set(EXECUTABLE_NAME "Foo")

# Find Qt packages.
find_package(Qt5Core)
find_package(Qt5Widgets)
find_package(Qt5Gui)

set(CMAKE_AUTOMOC ON)


set(SOURCES 
    "src/main.cpp"
    "src/Dialog.cpp"
)

set(HEADERS
    "includes/Dialog.h"
)

set(UI_FORMS
    "forms/Dialog.ui"
)

set(RESOURCES_FILES
    "resources/resources.qrc"
)

# Convert Qt UI and resource files to C/C++ files.
qt5_wrap_ui(UI_HEADERS ${UI_FORMS})
qt5_add_resources(RESOURCES ${RESOURCES_FILES})


# Define the executable to be built.
add_executable(${EXECUTABLE_NAME} 
    ${SOURCES}
    ${HEADERS}
    ${UI_HEADERS}
    ${RESOURCES}
)

# Include paths for this project.
target_include_directories(${EXECUTABLE_NAME} PRIVATE
    "${CMAKE_CURRENT_SOURCE_DIR}/includes"
    "${CMAKE_CURRENT_BINARY_DIR}"
)

# Link to appropriate libraries.
target_link_libraries(${EXECUTABLE_NAME}
    Qt5::Core
    Qt5::Widgets
    Qt5::Gui
)


# Set distribution location and project structure.
set(DIST_DIR "${CMAKE_BINARY_DIR}/dist/${EXECUTABLE_NAME}")
set_property(TARGET ${EXECUTABLE_NAME} PROPERTY FOLDER "Guis")


# Setup distribution environment and copy final executable.
add_custom_command(TARGET ${EXECUTABLE_NAME}
  POST_BUILD
  COMMAND ${CMAKE_COMMAND} -E make_directory ${DIST_DIR}
  COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${EXECUTABLE_NAME}> ${DIST_DIR}
)

# OS specific deployment setup for sytems without Qt installed.
if(WIN32)
  add_custom_command(TARGET ${EXECUTABLE_NAME}
    POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/QtDeploymentFiles/run.bat" ${DIST_DIR}/${EXECUTABLE_NAME}.bat
    COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/QtDeploymentFiles/qt.conf" ${DIST_DIR}
  )

elseif(UNIX AND NOT APPLE)
  add_custom_command(TARGET ${EXECUTABLE_NAME}
    POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/QtDeploymentFiles/run.sh" ${DIST_DIR}/${EXECUTABLE_NAME}.sh
  )
endif()

连同此顶级CMakeLists.txt:

Top Level CMakeLists.txt

cmake_minimum_required(VERSION 3.0.2)
project("Test")

add_subdirectory("FooProj")
add_subdirectory("BarProj")

一切都能完成,编译和运行。 自动完成也可以。

我添加了我需要的Qt库项目,即使使用库文件,一切仍然可以正常工作。 这是我的库的cmake文件:

Qt Library CMakeLists.txt

cmake_minimum_required(VERSION 3.0.2)
project("QtLib")
set(LIB_NAME "QtLib")

# Find Qt packages.
find_package(Qt5Core)
find_package(Qt5Widgets)

set(CMAKE_AUTOMOC ON)

# Set source files to be built.
set(SOURCES
    "src/LibFile1.cpp"
    "src/LibFile2.cpp"
    .
    .
    .
)

set(HEADERS
    "includes/LibFile1Header.h"
    "includes/LibFile2Header.h"
    "includes/OtherHeaders.h"
    .
    .
    .
)

add_library(${LIB_NAME} ${SOURCES} ${HEADERS})

set_property(TARGET ${LIB_NAME} PROPERTY FOLDER "Libs")

target_include_directories(${LIB_NAME} PRIVATE
    "${Qt5Core_INCLUDE_DIRS}"
    "${Qt5Widgets_INCLUDE_DIRS}"
    "${CMAKE_CURRENT_BINARY_DIR}"
)
target_include_directories(${LIB_NAME} PUBLIC
    "${CMAKE_CURRENT_SOURCE_DIR}/includes"
)


target_link_libraries(${LIB_NAME}
    Qt5::Core
    Qt5::Widgets
)

最后,我添加了一个真实的项目(其中一个不会自动完成),其结构如下:

-forms
    -MainForm.ui
-resources
    -resources.qrc
    -resource files and dirs
-src
    -main.cpp
    -MainWindow.cpp
-includes
    -MainWindow.h

CMake文件与上面的文件完全相同。 一切都能完成,编译和运行,但是自动完成会停止工作。 我还注意到找不到ui_MainWindow.h(在我的项目二进制目录中自动生成的那个)。

真正奇怪的是,如果我只是完全相同的文件而没有任何更改,只是将其作为一个独立的项目打开,则自动完成功能会起作用。

我的cmake文件是否有问题,还是Qt相关问题? VS2013中发生了同样的事情,这使我认为它与QtCreator不相关,但我不确定。

阅读更多内容后,似乎可能是QtCreator问题(尽管我不知道为什么在我第一次测试VS2013时遇到问题)。 我最终将QtCreator升级到3.6,自动完成问题消失了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM