eclipse CDTでのライブラリの参照
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

eclipse CDTでのライブラリの参照

2013-11-29 00:59

    前回Cygwinで使ってるビルドセットを使って、
    eclipse上でコードを弄るやり方を紹介?したんだけど、

    makefileを自動生成に設定したCDTのプロジェクトで、ライブラリの参照方法がわかったのでメモ。

    これは新規ブロジェクト作成で実行可能なプロジェクトにするか、後からプロジェクトのプロパティの「C/C++ビルド」でも設定できる。


    例えば前回の例でffmpegはちょっと仰々しいけど、
    lame(mp3)のライブラリだけを使用して、エンコード/デコードのプログラムを書きたい場合、

    javarにはライブラリって言われても、やることはjarにパス通すくらいだけど、*.jarはそれ自体が実行可能だったりだけど。
    cygwinとかlinuxでは静的ライブラリが*.aで、動的ライブラリは*.so、
    windowsでは静的ライブラリが*.lib、動的ライブラリが*.dllみたいな感じで、
    リンクして、モジュールの処理が他のプログラムから呼べる。
    リンクってなんなんだかよーわからん。。またいつか考えるとして


    ライブラリの作成は、linuxだったら先の方法でlameをビルドすると、/usr/local/libにlibmp3lame.aがあるのでそれを使えばいいけど、Windows用のバイナリの作成方法が何度やってもうまくいかなかったので、ググるとバイナリでlibmp3lame-static.libとlame_enc.dllを見つけたからそれを使ってみた。*.aを参照してもWindowsのランタイムとは関係なから?いける模様。


    ・CDTでの参照方法
    ライブラリを使用するプロジェクトのプロパティで「C/C++」→「パスおよびシンボル」で、
    「ライブラリー・パス」タブで*.libか*.dllのあるディレクトリを設定、
    「ライブラリー」タブでライブラリーの最初のlibと最後の.libを抜いた名前
    例)
    libmp3lame.a→mp3lame
    lame_enc.dll→lame_enc

    を設定してプロジェクトをビルドする。

    (これはDebug又はRelease配下にあるobjects.mkの
    LIBS := -llame_enc -lmp3lame
    って書くのと同じ事っぽいね。)

    で、コードはStackOverFlowに乗ってたコードをそのまま実行してみたんだが、

    FILE *pcm = fopen("file.wav", "rb");
    FILE *mp3 = fopen("file.mp3", "wb");

    const int PCM_SIZE = 1152;
    const int MP3_SIZE = 1152;

    short int pcm_buffer[PCM_SIZE*2];
    unsigned char mp3_buffer[MP3_SIZE];

    lame_t lame = lame_init();
    lame_set_in_samplerate(lame, 44100);
    lame_set_VBR(lame, vbr_default);
    lame_init_params(lame);

    fprintf(stderr,"TEST 2\n");
    do {
    read = fread(pcm_buffer, 2*sizeof(short int), PCM_SIZE, pcm);
    fprintf(stderr,"TEST 2\n");
    if (read == 0)
    write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE);
    else
    write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE);
    fwrite(mp3_buffer, write, 1, mp3);
    } while (read != 0);

    fprintf(stderr,"TEST 3\n");
    lame_close(lame);
    fclose(mp3);
    fclose(pcm);


    これだとAndroidのAudioRecorderで録ったデータはうまく動作しなかったんだが、
    モノラルの場合初期化で設定する関数があったので呼んで、データによってlame_encode_bufferに渡す型が違う様で、正しい引数にしたらなんとかうまくいった。







    広告
    コメントを書く
    コメントをするには、
    ログインして下さい。