导入静态库wt_lib.a时出现R_Lib、T_Lib相关未定义引用报错
问题解答
核心结论
你之前的假设是错误的,必须额外链接R_Lib和T_Lib才能解决当前的未定义引用报错。
原因解释
- 后缀为
.a的文件是静态库,它本质上只是编译生成的目标文件的打包归档集合,静态库构建阶段不会执行完整的链接操作,它依赖的第三方库的代码和符号不会被打包到自身的.a文件中。 - 只有构建可执行文件、或者动态库(
.so/.dll)时,链接器才会完成所有符号的解析和合并操作。你看到的wt_lib.a构建时的target_link_libraries配置,只是记录了该库的依赖关系,并没有完成依赖的合并。
现有配置的错误修正
你当前导入wt_lib.a的CMake配置存在明显错误:你把静态库错误声明成了SHARED类型的导入目标,需要先修正配置:
set(target WTLib) # 静态导入库需指定为STATIC而非SHARED add_library(${target} STATIC IMPORTED GLOBAL) set_target_properties(${target} PROPERTIES IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/lib/wt_lib.a" # 后续拿到R_Lib和T_Lib后可加上这一行,应用侧无需再手动添加依赖 # INTERFACE_LINK_LIBRARIES "R_Lib;T_Lib" )
解决方案
你现在有两个可选方案解决报错:
- 向wt_lib.a的提供方索要
R_Lib和T_Lib的库文件,将这两个库也加入到你应用侧的target_link_libraries配置中即可 - 要求wt_lib.a的提供方重新交付库文件:要么交付已经合并了所有依赖的全量静态库,要么交付已经完成链接的动态库版本,这两种情况你都不需要再额外链接
R_Lib和T_Lib
内容的提问来源于stack exchange,提问作者Flip024
相关产品推荐
相关产品推荐

