CMake问题:如何在仅编译共享库的项目中编译静态librockchip_mpp?
静态构建librockchip_mpp时出现未定义引用的问题
Rockchip MPP仓库包含构建librockchip_mpp库的源码,该库是访问瑞芯微SoCs视频处理单元的必要组件,同时是为瑞芯微平台提供硬件视频加速的某FFmpeg分支的依赖项。我需要构建该FFmpeg分支的静态版本,因此必须构建静态版的librockchip_mpp,但原Rockchip MPP仓库仅支持编译共享库。
我对仓库的CMakeLists.txt文件做了如下修改:
- 删除不必要的单元测试
- 移除旧款瑞芯微SoCs对应的
librockchip_vpu库 - 将构建流程从生成共享库改为生成静态库
核心修改集中在mpp/CMakeLists.txt文件,我在这里将librockchip_mpp的构建类型从共享库改为静态库。
但编译得到的librockchip_mpp.a存在大量未定义引用问题,例如执行以下命令后:
# nm mpp/librockchip_mpp.a | grep mpp_frame_deinit U mpp_frame_deinit
这显然不符合预期,因为mpp_frame_deinit函数明确定义在静态库libmpp_base.a中:
# nm mpp/base/libmpp_base.a | grep mpp_frame_deinit U mpp_frame_deinit 00000000000001b0 T mpp_frame_deinit
并且我在mpp/CMakeLists.txt中已经通过target_link_libraries完成了库的链接配置:
target_link_libraries(${MPP_STATIC} mpp_codec mpp_hal mpp_vproc ${ASAN_LIB} ${BEGIN_WHOLE_ARCHIVE} mpp_base ${END_WHOLE_ARCHIVE})
其中${MPP_STATIC}指代待构建的librockchip_mpp.a,mpp_base即正常工作的静态库libmpp_base.a。
为什么会出现这种符号未定义的问题?我已经花费数周尝试各类在线方案,但始终无法构建出可用的静态librockchip_mpp.a库,希望熟悉CMake的开发者能提供帮助。
内容的提问来源于stack exchange,提问作者Marc Altmann
相关产品推荐
相关产品推荐

