Я работаю над проектом, который использует 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, но я не уверен.