You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Qt与CMake中如何用自定义MMAPI宏生成带导出的MOC文件

问题1:让MOC生成的staticMetaObject使用自定义MMAPI宏导出

  1. 补全MMAPI宏,覆盖导入、导出两种场景:
#ifdef EXPORTDLL
#define MMAPI __declspec(dllexport)
#else
#define MMAPI __declspec(dllimport)
#endif
  1. 定义QT_MOC_EXPORT宏指向MMAPI,让MOC生成staticMetaObject时自动带上导出标记:
#ifdef EXPORTDLL
#define QT_MOC_EXPORT MMAPI
#endif

将这段代码放在包含Q_OBJECT类的头文件之前,或者项目全局头文件中。
3. 保持类定义不变:

class MMAPI myClass : public QObject {
    Q_OBJECT
    // ... 类成员
};

这样MOC生成的staticMetaObject会被标记为MMAPI导出,解决链接错误。

问题2:静态编译时QRC文件无法被QML和Qt库找到

  • 在主程序初始化代码(比如main函数开头)或静态库的初始化逻辑中,调用Q_INIT_RESOURCE宏触发资源加载,假设资源文件名为my_resources.qrc:
int main(int argc, char *argv[]) {
    Q_INIT_RESOURCE(my_resources);
    QApplication app(argc, argv);
    // ... 后续代码
}

如果是静态库,可添加导出的初始化函数,让调用方在使用库前主动调用。

  • QML中访问资源必须使用qrc:///前缀,例如:
import "qrc:///qml/modules"
  • CMake静态编译时,确保用qt_add_resources添加资源,链接必要的Qt静态模块,并定义QT_STATIC宏:
add_definitions(-DQT_STATIC)
qt_add_resources(MY_LIB_RESOURCES my_resources.qrc)
add_library(my_lib STATIC ${MY_LIB_SOURCES} ${MY_LIB_RESOURCES})
target_link_libraries(my_lib Qt5::Core Qt5::Qml Qt5::Quick)

内容的提问来源于stack exchange,提问作者RageLog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 00:21:39