在Qt与CMake中如何用自定义MMAPI宏生成带导出的MOC文件
问题1:让MOC生成的staticMetaObject使用自定义MMAPI宏导出
- 补全MMAPI宏,覆盖导入、导出两种场景:
#ifdef EXPORTDLL #define MMAPI __declspec(dllexport) #else #define MMAPI __declspec(dllimport) #endif
- 定义
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
相关产品推荐
相关产品推荐

