提问人:Marc Altmann 提问时间:11/11/2023 最后编辑:TsyvarevMarc Altmann 更新时间:11/11/2023 访问量:51
CMake:如何在只编译共享库的项目中编译静态库?
CMake: How to compile a static library in a project that only compiles a shared library?
问:
此存储库包含用于构建一个名为的库的源代码,该库是访问瑞芯微 SoC 视频处理单元所必需的。该库是这个 FFmpeg fork 的依赖项,它使 rockchip 平台上的硬件视频加速成为可能。我尝试构建此 FFmpeg 分支的静态版本,因此需要构建 .然而,rockchip mpp repo 只是构建了一个共享库。librockchip_mpp
librockchip_mpp
因此,我尝试更改存储库的文件。我删除了一些构建库不需要的单元测试,删除了旧版瑞芯微 SoC 的库(),并尝试将构建过程从共享更改为静态。我在这里上传了我的更改。在这里你可以看到我的 fork 与原始 repo 的差异。CMakeLists.txt
librockchip_vpu
最重要的文件是 。这里添加了库。在它成为共享库之前,我将其更改为静态。mpp/CMakelists.txt
librockchip_mpp
但是,编译后收到的 I 包含许多未定义的引用,例如此函数(从 build 目录执行):librockchip_mpp.a
# nm mpp/librockchip_mpp.a | grep mpp_frame_deinit
U 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
${MPP_STATIC}
librockchip_mpp.a
mpp_base
libmpp_base.a
target_link_libraries(${MPP_STATIC} mpp_codec mpp_hal mpp_vproc ${ASAN_LIB}
${BEGIN_WHOLE_ARCHIVE} mpp_base ${END_WHOLE_ARCHIVE})
那么为什么这个符号没有定义呢?
在过去的几周里,我花了很多时间,尝试了我在网上找到的所有东西,但我无法构建一个有效的静态库。我希望比我更熟悉 CMake 的人能够帮助我让它工作。librockchip_mpp.a
答: 暂无答案
评论
librockchip_mpp.a
mpp_frame_deinit
libmpp_base.a
librockchip_mpp.a
libmpp_base.a
target_link_libraries
target_link_libraries