3

我正在尝试使用 Adob​​e Alchemy 移植 FLAC 编码器以在 Flash 中使用,但无法弄清楚问题出在哪里。
我在 Windows 上使用 Alchemy for Cygwin。它已正确安装和配置。
以下是我为了移植 FLAC 编码器而遵循的步骤:

  1. 下载最新版本的 FLAC 源码 (1.2.1)
  2. ./configure --enable-static=true --enable-shared=false在启用炼金术的情况下配置 FLAC 源( )(alc-on在配置之前)
  3. 在启用炼金术的情况下编译 libFLAC(make在 src/libFLAC 文件夹中)
  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

encodeflac.c 是 FLAC 源 (examples/c/encode/file/main.c) 中包含的示例的修改版本,用于与 ActionScript ByteArrays 一起使用。

swc 将在没有警告或错误的情况下编译。但是最终的 swc 大小只有 85kb,而静态库大小(libFLAC.a)大约是 1mb!此外,编码不起作用。尝试在AS中使用时出现以下错误: 是否表示swc中不包含静态库?为什么?
[Fault] exception, information=Undefined sym: FLAC_stream_encoder_new

提前致谢。

4

2 回答 2

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

于 2012-02-03T09:29:20.337 回答
1

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

  1. gcc 区分大小写。您必须使用 -lFLAC(不是 -lflac)
  2. alchemy 需要构建 libFLAC.a 时生成的 FLAC.l.bc 文件

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

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

于 2011-05-16T15:07:48.337 回答