我试图用Alchemy移植FLAC编码器,以便在闪存中使用,但不知道问题出在哪里。
我在Windows上为Cygwin使用炼金术。它已正确安装和配置。
以下是我为移植FLAC编码器所遵循的步骤:
(1.2.1)
./configure --enable-static=true --enable-shared=false),启用炼金术(alc-on先于已启用炼金术(make在src/libFLAC文件夹中)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中没有包含静态库?为什么?
提前谢谢。
发布于 2011-05-16 15:07:48
炼金术的swc链接器没有很好的错误报告,这使得调试很困难。所发生的事情是链接器没有找到库。如何修复:
时生成的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
发布于 2012-02-03 09:29:20
我花了一段时间,但在stream_encoder.c (1.2.1版)的第956行中,我成功地找到了与此赋值的链接错误:
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:
#define SWAP_BE_WORD_TO_HOST(x) (x<<24|(x&0x0000FF00)<<8|(x&0x00FF0000)>>8|x>>24)希望它能帮助任何试图用炼金术编译Flac库的人。
https://stackoverflow.com/questions/6017993
复制相似问题