如何在qt_add_qml_module中指定依赖关系(CMake for Qt 6.2)

4uqofj5v  于 2022-11-11  发布在  其他
关注(0)|答案(2)|浏览(223)

当使用qt_add_qml_module指定QML模块时,如何处理它所依赖的Qt模块(例如QtMultimedia)?
如果我有一个扩展QML的Synthesizer类,但它没有依赖项,下面的代码就可以正常工作:

qt_add_qml_module(Synth
    URI Synth
    VERSION 1.0
    SOURCES
        Synthesizer.h Synthesizer.cpp
)

target_include_directories(Synthplugin
     PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
)

target_link_libraries(myapp
    PRIVATE Qt6::Quick
    Synth
)

但是,如果Synthesizer使用QtMultimedia类,则这是不够的,并会导致如下错误:

Undefined symbols for architecture arm64:
  "QAudioSink::start()", referenced from:
      Synthesizer::start() in Synthesizer.cpp.o
raogr8fs

raogr8fs1#

这个问题没有理想的解决方案,AFAIK...但有解决方案。
在大多数系统上,您可以使用编译器选项忽略未解析的符号(这在构建共享库时非常有用,例如QML插件,在构建可执行文件时,符号将在稍后解析)。

add_link_options(-Wl,--unresolved-symbols=ignore-all)

然而,这并不是在所有系统上都可用。似乎在为Windows构建时这不是一个选项(参见Cygwin g++ --unresolved-symbols=ignore-all)。
对于这种情况,您有另一种解决方案,即使用link_libraries

link_libraries(Qt6::Multimedia)

qt_add_qml_module(Synth
  URI Synth
  VERSION 1.0
  SOURCES Synthesizer.h Synthesizer.cpp
)

...

缺点是link_libraries适用于当前目录或子目录中的所有目标......因此您可能需要重新构造makefile。

u5rb5r59

u5rb5r592#

我现在有一个解决方案,我已经使用了一段时间(但已经忘记了这个问题没有答案)。
首先,确保加载了Multimedia包。例如:

find_package(Qt6 6.2 COMPONENTS Qml Quick Multimedia REQUIRED)

然后,在您的qt_add_qml_module()之后,将其链接到Synth目标:

target_link_libraries(Synth PRIVATE Qt6::Multimedia)

还要注意,你的target_include_directories()应该使用目标Synth,而不是Synthplugin,我会把它设置为私有,因为没有必要把它设置为公共。

target_include_directories(Synth PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})

相关问题