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}
)
Другие вопросы по тегам