2016-03-03 2 views
0

Я работаю над проектом, который использует cmake как систему сборки и работает в QtCreator просто отлично. Есть суб-проекты (некоторые Qt связаны, а другие просто C++), и до сих пор все они могли находить файлы заголовков и, следовательно, обеспечивать автоматическую полную функциональность.QtCreator CMake Project Auto-Complete не всегда работает?

В какой-то момент я добавил проект Qt и заметил, что мои заголовки для Qt proejcts не были найдены редактором. Очень странно, что они компилируются и выполняются с помощью QtCreator 'Build-> Build All'. Это почти похоже на то, что QtCreator просто не может найти их для автозаполнения.

Я огляделся, и у пользователей возникли проблемы в более ранних версиях QtCreator, которые находили классы Qt, но, похоже, не обнаружили проблем с поиском определенных файлов заголовков.

Я собрал упрощенный проект и добавил два новых проекта приложений виджета Qt, а главное окно 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, и моя проблема с автозаполнением исчезла.

Смежные вопросы