2016-03-03 61 views
0

我一直在研究一個使用cmake作爲構建系統並在QtCreator中工作的項目。有子項目(一些Qt相關,其他只是簡單的C++),直到現在,他們都能夠找到頭文件,因此提供了自動完成功能。QtCreator CMake項目自動完成不總是工作嗎?

在某些時候,我添加了一個Qt項目,並注意到我的編輯器沒有找到Qt項目的頭文件。真奇怪的是他們通過QtCreator'Build-> Build All'編譯並運行得很好。這幾乎就像QtCreator無法找到他們的自動完成。

我環顧四周,用戶在QtCreator的早期版本中發現問題,發現Qt類,但找到他們定義的頭文件似乎沒有問題。

我把一個簡化的「項目」放在一起,並添加了兩個新的Qt Widget應用程序項目,主窗口是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相關的,但我不確定。

回答

0

在閱讀了一會兒之後,似乎這可能是一個QtCreator問題(雖然我不知道爲什麼我在第一次測試VS2013時遇到了問題)。我最終將我的QtCreator升級到3.6,並且我的自動完成問題消失了。