我在尝试构建 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
,我得到了更多未定义的引用 - sin
,cos
,__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
并不重要,它可以以任何一种方式构建。