簡體   English   中英

在iOS平台上編譯FFmpeg框架時發生錯誤

[英]An error occurred while compiling the FFmpeg framework on the iOS platform

我使用的ffmpeg版本是3.0,Xcode版本是7.3.1,編譯時間已報告為以下錯誤:

Undefined symbols for architecture x86_64:
 "_libiconv", referenced from:
   _avcodec_decode_subtitle2 in libavcodec.a(utils.o)
 "_libiconv_close", referenced from:
  _avcodec_open2 in libavcodec.a(utils.o)
  _avcodec_decode_subtitle2 in libavcodec.a(utils.o)
 "_libiconv_open", referenced from:
  _avcodec_open2 in libavcodec.a(utils.o)
  _avcodec_decode_subtitle2 in libavcodec.a(utils.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我的項目已在以下框架和庫中引入:

1.VideoToolbox.framework

2.libiconv.2.4.0.tbd

3.libz.tbd

4.libbz2.tbd

我和你有同樣的問題。 我發現libiconv.tbd(或libiconv2.tbd或libiconv2.4.0.tbd)來自macOS 10.12(在我的情況下)存在兼容問題,其中導出的符號為iconv/iconv_open/iconv_close而ffmpeg調用libiconv函數(如libiconv/libiconv_open/libiconv_close

解決方案是從框架/庫和libiconv.a的一個特定版本中刪除libiconv.2.4.0,其中libiconv / libiconv_open / libiconv_close是導出的符號。 就我而言,我在/ opt / local / lib中找到了libiconv.a的另一個副本。 我只是將此lib文件復制到我的項目中並添加它。

請嘗試一下,讓我知道它是否能夠解決您的問題。

我同意Eureka.gh。 根本原因應該是符號不匹配。
我在下面顯示我的測試結果。

LiaotekiMacBook-Pro:lib liaokuohsun$ nm libavcodec.a | grep iconv
                 U _libiconv
                 U _libiconv_close
                 U _libiconv_open

LiaotekiMacBook-Pro:lib liaokuohsun$ nm libiconv.dylib | grep iconv
00000000000f2d80 S ___iconv_2VersionNumber
00000000000f2d50 S ___iconv_2VersionString
00000000000f4750 D __libiconv_version
0000000000003174 T _iconv
00000000000034b7 T _iconv_canonicalize
0000000000003196 T _iconv_close
0000000000001cdd T _iconv_open
00000000000031a3 T _iconvctl
00000000000032ac T _iconvlist
0000000000015f0d T _libiconv_relocate
00000000000f4760 b _libiconv_relocate.initialized
0000000000015e54 T _libiconv_set_relocation_prefix

在這里,我提供了另一個解決方案。
使用代碼中的某些包裝函數,可以修復此鏈接錯誤。

#include <iconv.h>
iconv_t libiconv_open(const char *tocode, const char *fromcode)
{
    return iconv_open(tocode, fromcode);
}

size_t libiconv(iconv_t cd,
             char **inbuf, size_t *inbytesleft,
             char **outbuf, size_t *outbytesleft)
{
    return iconv( cd, inbuf, inbytesleft, outbuf, outbytesleft);
}

int libiconv_close(iconv_t cd)
{
    return iconv_close(cd);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM