Gcc

靜態建構 libvorbis 和 libmp3lame 時出錯

  • May 28, 2018

我在嘗試建構 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無關緊要,無論哪種方式都可以建構。

引用自:https://unix.stackexchange.com/questions/446343