我使用的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
答案 0 :(得分:0)
我和你有同样的问题。我发现libiconv.tbd(或libiconv2.tbd或libiconv2.4.0.tbd)来自macOS 10.12(在我的情况下)具有兼容的问题,其中导出的符号为class Keyword < ActiveRecord::Base
has_many :results
has_many :sites, through: :results
end
class Site < ActiveRecord::Base
has_many :results
has_many :keywords, through: :results
end
class Result < ActiveRecord::Base
belongs_to :site
belongs_to :keyword
end
而ffmpeg调用libiconv函数,如{ {1}}。
解决方案是从框架/库和libiconv.a的一个特定版本中删除libiconv.2.4.0,其中libiconv / libiconv_open / libiconv_close是导出的符号。就我而言,我在/ opt / local / lib中找到了另一个libiconv.a副本。我只是将这个lib文件复制到我的项目并添加它。
如果能够解决您的问题,请尝试让我知道。
答案 1 :(得分:0)
我同意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);
}