У меня возникают проблемы при попытке создать статический двоичный файл из ffmpeg – у меня работает почти вся assembly, за исключением двух библиотек – libvorbis и libmp3lame.
Эти две библиотеки не работают во время ./configure, особенно для неопределенных функций из math.h
/ libm
:
libvorbis: gcc -L/vol/build/lib -static -static-libstdc++ -static-libgcc -Wl,--as-needed -Wl,-z,noexecstack -I/vol/build/include -L/vol/build/lib -o /tmp/ffconf.UKKLGhCv/test /tmp/ffconf.UKKLGhCv/test.o -lvorbis -lm -logg -lstdc++ -lpthread -lexpat -ldl -lm --enable-libopencore-amrnb /vol/build/lib/libvorbis.a(envelope.o): In function `_ve_envelope_init': envelope.c:(.text+0x983): undefined reference to `_ZGVbN2v_sin' envelope.c:(.text+0x9a9): undefined reference to `_ZGVbN2v_sin' /vol/build/lib/libvorbis.a(lsp.o): In function `vorbis_lsp_to_curve': lsp.c:(.text+0x650): undefined reference to `_ZGVbN2v_cos' lsp.c:(.text+0x669): undefined reference to `_ZGVbN2v_cos' libmp3lame: gcc -L/vol/build/lib -static -static-libstdc++ -static-libgcc -Wl,--as-needed -Wl,-z,noexecstack -o /tmp/ffconf.dC4w1f5B/test /tmp/ffconf.dC4w1f5B/test.o -lmp3lame -lm -lstdc++ -lpthread -lexpat -ldl -lm --enable-libopencore-amrnb /vol/build/lib/libmp3lame.a(psymodel.o): In function `init_s3_values': psymodel.c:(.text+0x14d3): undefined reference to `_ZGVbN2v___exp_finite' psymodel.c:(.text+0x14fa): undefined reference to `_ZGVbN2v___exp_finite' /vol/build/lib/libmp3lame.a(psymodel.o): In function `psymodel_init': psymodel.c:(.text+0xb62d): undefined reference to `_ZGVbN4vv___powf_finite' psymodel.c:(.text+0xb677): undefined reference to `_ZGVbN4vv___powf_finite' psymodel.c:(.text+0xb6c4): undefined reference to `_ZGVbN4vv___powf_finite' psymodel.c:(.text+0xb711): undefined reference to `_ZGVbN4vv___powf_finite' psymodel.c:(.text+0xb75b): undefined reference to `_ZGVbN4vv___powf_finite' /vol/build/lib/libmp3lame.a(psymodel.o):psymodel.c:(.text+0xb7a2): more undefined references to `_ZGVbN4vv___powf_finite' follow /vol/build/lib/libmp3lame.a(util.o): In function `fill_buffer': util.c:(.text+0x28a6): undefined reference to `_ZGVbN2v_cos' util.c:(.text+0x28cc): undefined reference to `_ZGVbN2v_cos' util.c:(.text+0x28fb): undefined reference to `_ZGVbN2v_cos' util.c:(.text+0x2921): undefined reference to `_ZGVbN2v_cos' util.c:(.text+0x29cc): undefined reference to `_ZGVbN2v_sin' util.c:(.text+0x29e8): undefined reference to `_ZGVbN2v_sin'
Я не могу понять, как заставить их успешно строить. Из того, что я понимаю, передачи опции -lm
должно быть достаточно, но, очевидно, это не так. Я проверил наличие libm.a
, который находится по адресу /usr/lib/x86_64-linux-gnu/libm.a
, я также попытался передать этот каталог во флаги -L
, но без разницы. При удалении флага -static
библиотеки libs прекрасно -static
, но полученный двоичный файл (duh) связан с libm.so.
На всякий случай, вот флаги, которые я использую для сборки двух библиотек:
libvorbis: ./configure --prefix=${CMAKE_BINARY_DIR} --disable-shared --disable-oggtest libmp3lame: ./configure --prefix=${CMAKE_BINARY_DIR} --disable-shared
Я был бы признателен за любые указания о том, как исправить или отладить это дальше.
Редактировать: после того, как libm
с ним еще раз, кажется, что libm
становится связанным – когда я -lm
флаг -lm
, я получаю намного больше неопределенных ссылок – sin
, cos
, __pow_finite
и т. Д. Когда я его помещаю обратно, большинство из них _ZGVbN4vv___powf_finite
и остаются только те искаженные символы, как _ZGVbN4vv___powf_finite
и _ZGVbN2v_cos
.
Что ж, мне удалось решить эту проблему – поиск в Google искаженных символов, таких как _ZGVbN2v_cos
привел меня к этому _ZGVbN2v_cos
с упоминанием векторной математики, и в сочетании с выводом ldd
во время динамической ссылки с упоминанием libmvec
я понял, что мне, возможно, придется связать это также ,
Для libmp3lame он должен быть связан до libm:
gcc -L/vol/build/lib -static -o /tmp/ffconf.dC4w1f5B/test /tmp/ffconf.dC4w1f5B/test.o -lmp3lame -lmvec -lm
Для libvorbis порядок -lmvec
и -lmvec
не имеет значения, он -lmvec
любом случае.