在使用制作qt动态库时间,出现了调用时,无法解析的外部符号staticMetaObject;
所搜了半天,没有一个人解释清楚,给出的方案无非是将Q_OBJECT 注释
// Q_OBJECT
实际上问题本身不是出在Q_OBJECT
而是出在Q_DECL_EXPORT和Q_DECL_IMPORT
Q_DECL_EXPORT/Q_DECL_IMPORT
也及时不同动态库之间引用,a.exe->b.dll->c.dll
项目a中:b(Q_DECL_IMPORT)、c(Q_DECL_IMPORT)
项目b中: b(Q_DECL_EXPORT)、c(Q_DECL_IMPORT)
项目c中:c(Q_DECL_EXPORT)
所以关键问题是,不应当使用同一个定义来指代Q_DECL_EXPORT,那样在所有的库中都是Q_DECL_EXPORT,就会出现 error LNK2001: 无法解析的错误
因此修改cmake定义
add_definitions(-DXXX_EXPORTS)
修改到各自项目
target_compile_definitions(${LIB_NAME} PRIVATE aaa_EXPORTS)
#ifdef aaa_EXPORTS
#define aaa_API Q_DECL_EXPORT
#else
#define aaa_API Q_DECL_IMPORT
#endif
target_compile_definitions(${LIB_NAME} PRIVATE bbb_EXPORTS)
#ifdef bbb_EXPORTS
#define bbb_API Q_DECL_EXPORT
#else
#define bbb_API Q_DECL_IMPORT
#endif
确保不同项目间相互独立Q_DECL_EXPORT/Q_DECL_IMPORT
最终解决方法
include_directories(${CMAKE_CURRENT_BINARY_DIR})
generate_export_header(${LIB_NAME})
if(INSTALL_MEVWIDGET)
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/${LIB_NAME}_export.h
DESTINATION include/${LIB_NAME}
)
endif()
#include "alib/alib_export.h"
class ALIB_EXPORT BCLASS {
};



2793

被折叠的 条评论
为什么被折叠?



