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

77 views Asked by At

This repo contains the source code to build a library called librockchip_mpp that is necessary to access the video processing unit of Rockchip SoCs. The library is a dependency of this FFmpeg fork that enables hardware video acceleration on the rockchip platform. I try to build a static version of this FFmpeg fork and therefore need to build a static version of librockchip_mpp. However, the rockchip mpp repo just builds a shared library.

Therefore I tried to change the CMakeLists.txt files of the repo. I deleted some unit tests that are not necessary to build the library, deleted a library for legacy rockchip SoCs (librockchip_vpu), and tried to change the build process from shared to static. I uploaded my changes here. And here you can see the diffs of my fork vs the original repo.

The most important file is mpp/CMakelists.txt. Here the librockchip_mpp library gets added. Before it was a shared library, I changed that to static.

However, the librockchip_mpp.a I receive after compiling contains lots of undefined references, for example this function (executed from the build directory):

# nm mpp/librockchip_mpp.a | grep mpp_frame_deinit
                   U mpp_frame_deinit

Which is weird, because the function is defined in this static library called libmpp_base.a:

# nm mpp/base/libmpp_base.a | grep mpp_frame_deinit
                   U mpp_frame_deinit
  00000000000001b0 T mpp_frame_deinit

And in the file mpp/CMakelists.txt I call target_link_libraries this way (${MPP_STATIC} refers to the librockchip_mpp.a library I try to correctly build, mpp_base refers to the libmpp_base.a library that always was a static library and works correctly I think):

target_link_libraries(${MPP_STATIC} mpp_codec mpp_hal mpp_vproc ${ASAN_LIB}
                      ${BEGIN_WHOLE_ARCHIVE} mpp_base ${END_WHOLE_ARCHIVE})

So why is this symbol undefined?

I spent a lot time in the past few weeks and tried everything that I found online, but I wasn't able to build a working static librockchip_mpp.a library. I hope that someone who is more familiar with CMake than me is kind enough to help me get it working.

0

There are 0 answers