时间:2011-05-16 13:15:59

标签: c++ c actionscript-3 alchemy

我正在尝试使用Adobe Alchemy将FLAC编码器移植到闪存中,但无法找出问题所在。
我在Windows上使用Alchemy for Cygwin。它已正确安装和配置 以下是我为了移植FLAC编码器而遵循的步骤:

  1. 下载最新版本的FLAC来源(1.2.1)
  2. 配置FLAC源(./configure --enable-static=true --enable-shared=false)并启用炼金术(配置前为alc-on
  3. 在启用炼金术的情况下编译libFLAC(sr​​c / libFLAC文件夹中为make
  4. 将头文件和已编译的静态库(libFLAC.a)复制到alchemy文件夹($ {ACLHEMY_HOME} / usr / local / include和$ {ACLHEMY_HOME} / usr / local / lib)
  5. 最后,以这种方式编译SWC:
    gcc encodeflac.c -O3 -Wall -swc -lFLAC -o encodeflac.swc
    或(无论如何)
    gcc encodeflac.c -O3 -Wall -swc -lflac -o encodeflac.swc
  6. 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中?为什么呢?

    提前致谢。

2 个答案:

答案 0 :(得分:1)

Alchemy的swc链接器没有很好的错误报告,这使得调试变得困难。发生的事情是链接器没有找到lib。如何解决它:

  1. gcc区分大小写。您必须使用-lFLAC(而不是-lflac)
  2. alchemy需要构建libFLAC.a时生成的FLAC.l.bc文件
  3. 不幸的是,让它实际链接会导致产生链接时错误:

    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在炼金术中编译。