Gcc
靜態建構 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
,但生成的二進製文件(duh)連結到 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
留下。
好吧,我設法解決了它 - Google搜尋損壞的符號,例如
_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,順序
-lm
和-lmvec
無關緊要,無論哪種方式都可以建構。