Qt statemachine scxml в проекте cmake без файла pro?
У меня есть большой проект с управлением cmake, в котором я хочу, чтобы часть использовала конечный автомат scxml из qt. Мой вопрос заключается в следующем:
Как я могу добавить модуль scxml, не имея pro-файла, который, как я понимаю, не работает с cmake?
Что-то вроде:
QT += scxm
3 ответа
Bisides для добавления Scxml в find_package(...)
макрос, дополнительные шаги CMake необходимы для интеграции Qt SCXML в ваше приложение:
# Add package
find_package(Qt5 5.10 REQUIRED Core Scxml)
# Link libraries
target_link_libraries(myapp-lib Qt5::Core Qt5::Scxml)
# Process your *.scsml files with Qt SCXML Compiler (qscxmlc)
qt5_add_statecharts(QT_SCXML_COMPILED chart1.scxml chart2.scxml)
# Add to executable
add_executable(myapp main.cpp ${QT_SCXML_COMPILED})
У вас должен быть список компонентов Qt для загрузки в ваш CMake, просто добавьте Scxml
к списку.
find_package(Qt5 5.9 REQUIRED
COMPONENTS Core Gui Widgets Xml Concurrent Scxml
)
Я опоздал на несколько лет, но ответов на этот вопрос не удалось найти.
Если скомпилированные файлы SCXML проходят через MOC, сборка выдаст следующую ошибку.
(...)
duplicate symbol 'chart1::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)' in:
src/CMakeFiles/foo.dir/foo_autogen/mocs_compilation.cpp.o
src/CMakeFiles/foo.dir/chart1.cpp.o
(...)
Чтобы избежать этой ошибки, файлы, созданные с помощью, необходимо явно пометить какSKIP_AUTOMOC
.
Также,qt5_add_statecharts
выгружает автоматически сгенерированные исходные файлы вCMAKE_CURRENT_BINARY_DIR
, поэтому этот путь должен быть указан вtarget_include_directories
быть доступным.
Пример ниже строится и запускается.
find_package(Qt5 5.15 REQUIRED Core Scxml)
target_link_libraries(myapp-lib
Qt5::Core
Qt5::Scxml
)
qt5_add_statecharts(QT_SCXML_COMPILED
chart1.scxml
chart2.scxml
)
set_source_files_properties(${QT_SCXML_COMPILED}
PROPERTIES
SKIP_AUTOMOC TRUE
)
add_executable(myapp
main.cpp
${QT_SCXML_COMPILED}
)
target_include_directories(myapp
PRIVATE
${CMAKE_CURRENT_BINARY_DIR}
)