3

Flash で使用するために Adob​​e Alchemy を使用して FLAC エンコーダーを移植しようとしていますが、問題の場所がわかりません。
Windows で Cygwin 用の Alchemy を使用しています。適切にインストールおよび構成されています。
FLACエンコーダーを移植するために私が従った手順は次のとおりです。

  1. FLAC ソースの最新バージョン (1.2.1) をダウンロードします。
  2. ./configure --enable-static=true --enable-shared=falseAlchemy を有効にしてFLAC ソースを構成する ( ) (alc-on構成前)
  3. alchemy を有効にして libFLAC をコンパイルします ( makesrc/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) に含まれる example の修正バージョンであり、ActionScript ByteArray で動作するように採用されています。

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) 全体 (ライブラリだけでなく) をビルドしようとしたときに、この同じエラーが発生しました。このエラーは、Alchemy が処理できない LLVM バイトコードを生成する C コードがある場合に発生します。(これが LLVM が生成するものの問題なのか、Alchemy のバグなのかは不明です。)

問題のあるコードがどこにあるかを突き止め、それを Alchemy が好むものに変更する必要があります (ロジックを実際に変更することはありません!)。ffmpeg で同様の問題を抱えている人を覚えているようです: http://forums.adobe.com/message/2905914#2905914

于 2011-05-16T15:07:48.337 に答える