CMake:如何在只编译共享库的项目中编译静态库?

CMake: How to compile a static library in a project that only compiles a shared library?

提问人:Marc Altmann 提问时间:11/11/2023 最后编辑:TsyvarevMarc Altmann 更新时间:11/11/2023 访问量:51

问:

此存储库包含用于构建一个名为的库的源代码,该库是访问瑞芯微 SoC 视频处理单元所必需的。该库是这个 FFmpeg fork 的依赖项,它使 rockchip 平台上的硬件视频加速成为可能。我尝试构建此 FFmpeg 分支的静态版本,因此需要构建 .然而,rockchip mpp repo 只是构建了一个共享库。librockchip_mpplibrockchip_mpp

因此,我尝试更改存储库的文件。我删除了一些构建库不需要的单元测试,删除了旧版瑞芯微 SoC 的库(),并尝试将构建过程从共享更改为静态。我在这里上传了我的更改。在这里你可以看到我的 fork 与原始 repo 的差异。CMakeLists.txtlibrockchip_vpu

最重要的文件是 。这里添加了库。在它成为共享库之前,我将其更改为静态。mpp/CMakelists.txtlibrockchip_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.txttarget_link_libraries${MPP_STATIC}librockchip_mpp.ampp_baselibmpp_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

C CMake 构建 静态 瑞芯微

评论

1赞 Tsyvarev 11/11/2023
创建静态库不涉及链接步骤。也就是说,库没有定义符号是完全正确的,这是在其他库中定义的。为了使用,不仅应该与该库链接,还应该与库链接。这是整个静态库的功能,而不是特定于 CMake 的功能。librockchip_mpp.ampp_frame_deinitlibmpp_base.alibrockchip_mpp.alibmpp_base.a
0赞 Marc Altmann 11/11/2023
我设法用你的解释编译了 FFmpeg。但是,调用静态库有什么意义呢?我在其他项目中多次看到这种情况。target_link_libraries
1赞 Tsyvarev 11/12/2023
“但是,调用静态库有什么意义?” - 请参阅:stackoverflow.com/questions/68341232/...target_link_libraries

答: 暂无答案