libvorbis 和 libmp3lame 静态构建期间出错

libvorbis 和 libmp3lame 静态构建期间出错

我在尝试构建 ffmpeg 的静态二进制文件时遇到了麻烦 - 我几乎整个构建都在工作,除了两个库 - 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,但生成的二进制文件(废话)链接到 libm.so。

以防万一,这些是我用来构建两个库的标志:

libvorbis:
./configure --prefix=${CMAKE_BINARY_DIR} --disable-shared --disable-oggtest

libmp3lame:
./configure --prefix=${CMAKE_BINARY_DIR} --disable-shared

如果有任何有关如何进一步修复或调试此问题的指示,我将不胜感激。

编辑:在玩了一些之后,似乎正在libm链接进来 - 当我删除标志时-lm,我得到了更多未定义的引用 - sincos__pow_finite等。当我把它放回去时,其中大部分消失后只剩下那些破损的符号,例如_ZGVbN4vv___powf_finite_ZGVbN2v_cos

答案1

好吧,我设法解决了这个问题 - 谷歌搜索损坏的符号,例如_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

-lm对于 libvorbis,和的顺序-lmvec并不重要,它可以以任何一种方式构建。

相关内容