Как заставить UI C сгенерировать ui_mainwindow.h в исходном каталоге с помощью cmake - PullRequest
1 голос
/ 14 февраля 2020

UI C успешно создает файл ui_mainwindow.h, но сохраняет его в каталоге сборки. Это приводит к ошибке времени компиляции «ui_mainwindow.h: такой файл или каталог не найден».

Если я добавлю полный путь к файлу ui_mainwindow.h в каталоге сборки, cmake (catkin_make) успешно соберет проект. Очевидно, я бы хотел избежать использования абсолютного пути к заголовочному файлу в моем исходном коде.

Соответствующие части моих CMakeLists:

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

find_package(Qt5 REQUIRED COMPONENTS Widgets Core )
add_executable(monitor src/mainwindow.cpp src/main.cpp src/mainwindow.ui)
qt5_use_modules(monitor Widgets)

target_link_libraries(monitor Qt5::Core Qt5::Widgets ${catkin_LIBRARIES} ${PCL_LIBRARIES} ${OpenCV_LIBRARIES} ${OpenCV_LIBS} )

Как заставить UI C создать файл ui_mainwindow.h в моей исходной директории. Или как мне включить каталог сборки cmake в мой CMakeLists.txt

Я пробовал

qt5_wrap_ui (monitor_UI src/mainwindow.ui OPTIONS -o 'ui_mainwindow.h')
add_executable(monitor src/mainwindow.cpp src/main.cpp ${monitor_UI})

, но безуспешно.

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Основываясь на комментарии Хайда, я просто добавил каталог сборки в includepath, используя

include_directories(
  ${CMAKE_CURRENT_BINARY_DIR}
)

, что решило мою проблему.

0 голосов
/ 14 февраля 2020

Переменная AUTOGEN_BUILD_DIR CMake указывает , где AUTOUIC должно генерировать файлы. Если вы хотите, чтобы сгенерированные файлы были размещены в вашем текущем исходном каталоге, вы можете установить для него значение CMAKE_CURRENT_SOURCE_DIR:

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
set(AUTOGEN_BUILD_DIR ${CMAKE_CURRENT_SOURCE_DIR})

Дополнительная заметка из CMake-Qt документация для использования AUTOUIC с переменной AUTOGEN_BUILD_DIR:

Сгенерированные файлы ui_*.h помещаются в каталог <AUTOGEN_BUILD_DIR>/include, который автоматически добавляется в INCLUDE_DIRECTORIES цели.

Итак, вы должны , а не явно указывать каталог, содержащий сгенерированные заголовки, в команде include_directories().

...