Qt WebAssembly项目链接外部静态库出现undefined symbol错误如何解决
解决方案
修正.pro文件的语法错误与链接配置
你当前的配置存在两处语法错误,且静态库链接规则仅对Windows桌面平台生效,是导致报错的核心原因:- 修正语法错误:将
CONFIG += c ++ 11改为CONFIG += c++11,将DEPENDPATH + =改为DEPENDPATH += - 调整链接库规则,增加WebAssembly平台的适配:
# Windows桌面版链接配置 win32: LIBS += -L$$PWD/../../TinyLib/build-TinyLib-Qt_5_15_0_MinGW_64-Debug/ -lTinyLib # WebAssembly版链接配置 wasm: LIBS += -L$$PWD/../../TinyLib/build-TinyLib-Qt_5_15_0_WebAssembly-Debug/ -lTinyLib如果仅需要编译WebAssembly版本,也可以直接去掉
win32:前缀,让链接规则对所有平台生效。- 修正语法错误:将
确认编译套件完全匹配
需保证TinyLib和TestWidget两个项目使用的Qt WebAssembly套件、emcc版本完全一致,你当前使用的emcc 1.39.8是Qt 5.15.0 WebAssembly的官方适配版本,重点确认TinyLib没有误用到桌面编译套件生成静态库。调整静态库符号可见性
如果修改配置后仍有报错,可在TinyLib项目的.pro文件中添加以下配置,避免静态库的对外符号被优化清除:
CONFIG += staticlib QMAKE_CXXFLAGS += -fvisibility=default QMAKE_CFLAGS += -fvisibility=default
如果TinyLib的类需要对外暴露,可添加导出标记:
// TinyLib全局头文件中添加 #ifdef TINYLIB_LIB #define TINYLIB_EXPORT Q_DECL_EXPORT #else #define TINYLIB_EXPORT Q_DECL_IMPORT #endif // 类定义处添加导出标记 class TINYLIB_EXPORT TinyLib { // 类成员定义 };
同时在TinyLib的.pro中添加DEFINES += TINYLIB_LIB。
- 排查路径与获取详细错误
如果仍有问题,可先将库路径替换为绝对路径测试链接是否生效,确认相对路径配置没有错误。需要更详细的错误信息时,可在TestWidget的.pro中添加QMAKE_LFLAGS += -s LLD_REPORT_UNDEFINED,输出完整的未定义符号上下文辅助定位。
内容的提问来源于stack exchange,提问作者Drow
相关产品推荐
相关产品推荐

