我正在尝试使用Adobe Alchemy将FLAC编码器移植到闪存中,但无法找出问题所在。
我在Windows上使用Alchemy for Cygwin。它已正确安装和配置
以下是我为了移植FLAC编码器而遵循的步骤:
./configure --enable-static=true --enable-shared=false
)并启用炼金术(配置前为alc-on
)make
)gcc encodeflac.c -O3 -Wall -swc -lFLAC -o encodeflac.swc
或(无论如何)gcc encodeflac.c -O3 -Wall -swc -lflac -o encodeflac.swc
encodeflac.c是FLAC源代码中包含的示例的修改版本(examples / c / encode / file / main.c),用于处理ActionScript ByteArrays。
swc将在没有警告或错误的情况下编译。但最终的swc大小只有85kb,而静态库大小(libFLAC.a)大约是1mb!此外,编码不起作用。
尝试在AS中使用它时出现以下错误:
[Fault] exception, information=Undefined sym: FLAC_stream_encoder_new
这是否意味着静态库不包含在swc中?为什么呢?
提前致谢。
答案 0 :(得分:1)
Alchemy的swc链接器没有很好的错误报告,这使得调试变得困难。发生的事情是链接器没有找到lib。如何解决它:
不幸的是,让它实际链接会导致产生链接时错误:
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 :(得分:1)
我花了一段时间,但我设法在stream_encoder.c(版本1.2.1)的第956行追踪到这个分配的链接错误:
encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_wide
它实际上似乎与宽方法的符号名称有关。尚未想出一个好的解决方案。我做的时候会修改我的答案。请注意,如果块大小太大(16位时超过4096),这只是一个问题,默认情况下绝不是这种情况,因此您可以安全地注释掉分配而不处理真正的问题......
只是抬头:当你实际使用Flac库时,你得到的只是零,检查bitwriter.c中的SWAP_BE_WORD_TO_HOST宏。出于某种原因,ntohl只返回零。尝试定义您自己的字节顺序交换器,如下所示:
#define SWAP_BE_WORD_TO_HOST(x) (x<<24|(x&0x0000FF00)<<8|(x&0x00FF0000)>>8|x>>24)
希望它可以帮助任何人试图让Flac lib在炼金术中编译。