Undefined symbol despite libraries being linked

Viewed 105

currently I'm trying to write a JNI function using ffmpeg features, but when I'm trying to run my java executable after a clean compile I get the following error:

/usr/lib/jvm/java-1.11.0-openjdk-amd64/bin/java: symbol lookup error: /lib/libmediaserv_ffmpeg.so: undefined symbol: _Z19avformat_open_inputPP15AVFormatContextPKcP13AVInputFormatPP12AVDictionary

I can't figure out why ffmpeg is not linked correctly.

mediaserv_ffmpeg.cpp:

#include <iostream>
#include <libavformat/avformat.h>
#include <libavutil/avutil.h>

JNIEXPORT jobject JNICALL Java_mediaserv_ffmpeg_getMetadata
        (JNIEnv* env, jclass cls, jstring path) { ... }

What I've tried so far is inspecting libmediaserv_ffmpeg.so:

 nm libmediaserv_ffmpeg.so --format=sysv | grep avformat
_Z19avformat_open_inputPP15AVFormatContextPKcP13AVInputFormatPP12AVDictionary|                |   U  |            NOTYPE|                |     |*UND*
_Z20avformat_close_inputPP15AVFormatContext|                |   U  |            NOTYPE|                |     |*UND*
_Z25avformat_find_stream_infoP15AVFormatContextPP12AVDictionary|                |   U  |            NOTYPE|                |     |*UND*

Which, I think, is just another way of saying that there are undefined symbols in the .so file.

The commands used to build the lib (taken from make VERBOSE=1):

/usr/bin/c++  -Dmediaserv_ffmpeg_EXPORTS -I/usr/lib/jvm/java-11-openjdk-amd64/include -I/usr/lib/jvm/java-11-openjdk-amd64/include/linux -I/mnt/g/Workspace/mediaserv/third-party/ffmpeg  -fPIC   -std=gnu++1z -o CMakeFiles/mediaserv_ffmpeg.dir/mediaserv_ffmpeg.cpp.o -c /mnt/g/Workspace/mediaserv/third-party/mediaserv_ffmpeg.cpp
/usr/bin/c++ -fPIC   -shared -Wl,-soname,libmediaserv_ffmpeg.so -o /mnt/g/Workspace/mediaserv/build/libs/libmediaserv_ffmpeg.so CMakeFiles/mediaserv_ffmpeg.dir/mediaserv_ffmpeg.cpp.o  -Wl,-rpath,/usr/lib/jvm/java-11-openjdk-amd64/lib:/usr/lib/jvm/java-11-openjdk-amd64/lib/server:/mnt/g/Workspace/mediaserv/third-party/ffmpeg/libavutil:/mnt/g/Workspace/mediaserv/third-party/ffmpeg/libavformat /usr/lib/jvm/java-11-openjdk-amd64/lib/libjawt.so /usr/lib/jvm/java-11-openjdk-amd64/lib/server/libjvm.so ../ffmpeg/libavutil/libavutil.so ../ffmpeg/libavformat/libavformat.so

I've already tried to seek for errors in GCC's trace option for the linker and it lists me which libraries it tries to link / is linking but the result stays the same.

/usr/bin/ld: mode elf_x86_64
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crti.o
/usr/lib/gcc/x86_64-linux-gnu/7/crtbeginS.o
CMakeFiles/mediaserv_ffmpeg.dir/mediaserv_ffmpeg.cpp.o
/usr/lib/jvm/java-11-openjdk-amd64/lib/libjawt.so
/usr/lib/jvm/java-11-openjdk-amd64/lib/server/libjvm.so
../ffmpeg/libavutil/libavutil.so
../ffmpeg/libavformat/libavformat.so
-lstdc++ (/usr/lib/gcc/x86_64-linux-gnu/7/libstdc++.so)
/lib/x86_64-linux-gnu/libm.so.6
/lib/x86_64-linux-gnu/libmvec.so.1
libgcc_s.so.1 (/usr/lib/gcc/x86_64-linux-gnu/7/libgcc_s.so.1)
/lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
libgcc_s.so.1 (/usr/lib/gcc/x86_64-linux-gnu/7/libgcc_s.so.1)
/usr/lib/gcc/x86_64-linux-gnu/7/crtendS.o
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.o

CMakeLists.txt:

cmake_minimum_required(VERSION 3.17)
project(mediaserv_ffmpeg)

set(CMAKE_CXX_STANDARD 17)
set(BUILD_SHARED_LIBS ON)
add_library(${PROJECT_NAME} SHARED mediaserv_ffmpeg.cpp mediaserv_ffmpeg.h)

find_package(JNI REQUIRED)

find_path(AVUTIL_INCLUDE_DIR libavutil/avutil.h HINTS ffmpeg REQUIRED)
find_library(AVUTIL_LIBRARY avutil HINTS ${PROJECT_SOURCE_DIR}/ffmpeg/libavutil PATHS REQUIRED)

find_path(AVFORMAT_INCLUDE_DIR libavformat/avformat.h HINTS ffmpeg REQUIRED)
find_library(AVFORMAT_LIBRARY avformat HINTS ${PROJECT_SOURCE_DIR}/ffmpeg/libavformat REQUIRED)

target_include_directories(${PROJECT_NAME} PRIVATE ${JNI_INCLUDE_DIRS} ${AVUTIL_INCLUDE_DIR} ${AVFORMAT_INCLUDE_DIR})

target_link_libraries(${PROJECT_NAME} ${JNI_LIBRARIES} ${AVUTIL_LIBRARY} ${AVFORMAT_LIBRARY})

Neither ffmpeg taken from the official ubuntu bionic repository nor a self-compiled version with configure --enable-shared works for me.

Where is my mistake or what could I still inspect?

Thanks in advance.

0 Answers
Related