首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Alchemy的libFLAC移植问题

使用Alchemy的libFLAC移植问题
EN

Stack Overflow用户
提问于 2011-05-16 13:15:58
回答 2查看 742关注 0票数 3

我试图用Alchemy移植FLAC编码器,以便在闪存中使用,但不知道问题出在哪里。

我在Windows上为Cygwin使用炼金术。它已正确安装和配置。

以下是我为移植FLAC编码器所遵循的步骤:

(1.2.1)

  • Configure
  1. 下载最新版本的FLAC源代码(./configure --enable-static=true --enable-shared=false),启用炼金术(alc-on先于已启用炼金术(make在src/libFLAC文件夹中)
  2. 复制头文件和编译的静态库(libFLAC.a)到炼金术文件夹(${ACLHEMY_HOME}/usr/local/include和${ACLHEMY_HOME}/usr/local/lib respectively)
  3. Finally,以这种方式编译SWC ):

gcc encodeflac.c -O3 -Wall -swc -lFLAC -o encodeflac.swc

或(随便)

gcc encodeflac.c -O3 -Wall -swc -lflac -o encodeflac.swc

C是包含在FLAC源代码中的示例的修改版本(示例/c/encode/file/main.c),用于与ActionScript ByteArrays一起工作。

swc将在没有警告或错误的情况下编译。但是最终的swc大小只有85 is,而静态库大小(libFLAC.a)大约是1mb!而且,编码不起作用。当我试图使用它时,我会得到以下错误:

[Fault] exception, information=Undefined sym: FLAC_stream_encoder_new

这是否意味着swc中没有包含静态库?为什么?

提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2011-05-16 15:07:48

炼金术的swc链接器没有很好的错误报告,这使得调试很困难。所发生的事情是链接器没有找到库。如何修复:

  1. gcc对大小写很敏感。您必须使用-lflac)
  2. alchemy (而不是-lFLAC需要生成libFLAC.a

时生成的FLAC.l.bc文件)

不幸的是,让它实际链接最终会产生一个链接时错误:

代码语言:javascript
复制
Cannot yet select: 0x198b960: i32 = ConstantPool < i64 6881500230622117888> 0
0   llc                                 0x00636dfe _ZNSt8_Rb_treeIN4llvm3sys4PathES2_St9_IdentityIS2_ESt4lessIS2_ESaIS2_EE13insert_uniqueERKS2_ + 6078
1   llc                                 0x006373a2 _ZNSt8_Rb_treeIN4llvm3sys4PathES2_St9_IdentityIS2_ESt4lessIS2_ESaIS2_EE13insert_uniqueERKS2_ + 7522
2   libSystem.B.dylib                   0x9402f2bb _sigtramp + 43
3   ???                                 0xffffffff 0x0 + 4294967295
4   libSystem.B.dylib                   0x940a323a raise + 26
5   libSystem.B.dylib                   0x940af679 abort + 73
6   llc                                 0x002f862b _ZN98_GLOBAL__N__Volumes_data_dev_FlaCC_llvm_2.1_lib_Target_AVM2_AVM2ISelDAGToDAG.cpp_00000000_F04616B616AVM2DAGToDAGISel10SelectCodeEN4llvm9SDOperandE + 187
7   llc                                 0x002fa193 _ZN98_GLOBAL__N__Volumes_data_dev_FlaCC_llvm_2.1_lib_Target_AVM2_AVM2ISelDAGToDAG.cpp_00000000_F04616B616AVM2DAGToDAGISel10SelectRootEN4llvm9SDOperandE + 819
8   llc                                 0x002e6a2c _ZN4llvm19X86_64TargetMachineD0Ev + 65116
9   llc                                 0x003de4ca _ZN4llvm11StoreSDNodeD1Ev + 1610
10  llc                                 0x0040d3fe _ZN4llvm11StoreSDNodeD1Ev + 193918
11  llc                                 0x0040f92e _ZN4llvm11StoreSDNodeD1Ev + 203438
12  llc                                 0x005d1926 _ZN4llvm12FunctionPassD1Ev + 20998
13  llc                                 0x005d1f3a _ZN4llvm12FunctionPassD1Ev + 22554
14  llc                                 0x005d20c5 _ZN4llvm12FunctionPassD1Ev + 22949
15  llc                                 0x00002e44 _mh_execute_header + 7748
16  llc                                 0x00001f36 _mh_execute_header + 3894
17  ???                                 0x00000006 0x0 + 6

在试图将libFLAC (v1.2.1)作为一个整体(不仅仅是库)构建时,我看到了同样的错误。当有某种C代码生成Alchemy无法处理的LLVM字节码时,就会发生此错误。(目前还不清楚这是LLVM产生的问题还是Alchemy的错误。)

您必须找出违规代码的所在,并将其更改为Alchemy所喜欢的内容(而不实际更改逻辑!)。我似乎还记得有人对ffmpeg有类似的问题:http://forums.adobe.com/message/2905914#2905914

票数 1
EN

Stack Overflow用户

发布于 2012-02-03 09:29:20

我花了一段时间,但在stream_encoder.c (1.2.1版)的第956行中,我成功地找到了与此赋值的链接错误:

代码语言:javascript
复制
encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_wide

实际上,它似乎与wide方法的符号名称有关。还没有找到一个好的解决方案。我会修改我的答案的。请注意,只有当块大小太大( 16位大于4096 )时,这才是一个问题,在默认情况下从来不是这样,所以您可以安全地注释掉赋值,而不处理真正的问题.

只需提醒一下:当您实际使用Flac库而只得到零时,请检查位写器c中的SWAP_BE_WORD_TO_HOST宏。由于某种原因,ntohl只返回零。尝试像这样定义您自己的endianness swapper:

代码语言:javascript
复制
#define SWAP_BE_WORD_TO_HOST(x) (x<<24|(x&0x0000FF00)<<8|(x&0x00FF0000)>>8|x>>24)

希望它能帮助任何试图用炼金术编译Flac库的人。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6017993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档