当使用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
2条答案
按热度按时间raogr8fs1#
这个问题没有理想的解决方案,AFAIK...但有解决方案。
在大多数系统上,您可以使用编译器选项忽略未解析的符号(这在构建共享库时非常有用,例如QML插件,在构建可执行文件时,符号将在稍后解析)。
然而,这并不是在所有系统上都可用。似乎在为Windows构建时这不是一个选项(参见Cygwin g++ --unresolved-symbols=ignore-all)。
对于这种情况,您有另一种解决方案,即使用link_libraries:
缺点是
link_libraries
适用于当前目录或子目录中的所有目标......因此您可能需要重新构造makefile。u5rb5r592#
我现在有一个解决方案,我已经使用了一段时间(但已经忘记了这个问题没有答案)。
首先,确保加载了
Multimedia
包。例如:然后,在您的
qt_add_qml_module()
之后,将其链接到Synth目标:还要注意,你的
target_include_directories()
应该使用目标Synth
,而不是Synthplugin
,我会把它设置为私有,因为没有必要把它设置为公共。