- 締切済み
・・・は未解決です、の対策を教えてください
開発環境はVC++です。C言語のヘッダーファイルやソースファイルをプロジェクトに入れてビルドすると・・・ state = speex_encoder_init(&speex_nb_mode); この部分でspeex_nb_modeは未解決ですとエラーがでます。 speex_nb_modeここの定義位置へ移動すると、speex.hが開きます。 このspeex.hは当然プロジェクトに入れてあります。 ちなみにspeex.hの記述は /** Default narrowband mode */ extern const SpeexMode speex_nb_mode; となっています。 解決策を教えてください。 初心者ですのでそのへんよろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- oshiete_poo_V1
- ベストアンサー率42% (15/35)
No.4に書いたのは http://www.speex.org/docs/api/speex-api-reference/structSpeexMode.html に書かれている第一番目の要素 const void * mode の中身だけです。
- oshiete_poo_V1
- ベストアンサー率42% (15/35)
たぶん、以下のような初期化に何を設定すべきか解っていないというようなレベルではなく 残念ながら構造体やプロジェクトなどが根本的に解っていないのだと推測されます。 (以下を初期化したくらいで解決出来るレベルにあるとは思えません。) ~_ctl が今回の・・・は未解決ですとどのように関係するのでしょうか??? もっと簡単な物から始めてはいかがでしょうかとしか言えません。。。 #インデントなどは消えています(うまい貼り付け方を教えてください) /* Default mode for narrowband */ static const SpeexNBMode nb_mode = { 160, /*frameSize*/ 40, /*subframeSize*/ 10, /*lpcSize*/ 17, /*pitchStart*/ 144, /*pitchEnd*/ #ifdef FIXED_POINT 29491, 19661, /* gamma1, gamma2 */ #else 0.9, 0.6, /* gamma1, gamma2 */ #endif QCONST16(.0002,15), /*lpc_floor*/ {NULL, &nb_submode1, &nb_submode2, &nb_submode3, &nb_submode4, &nb_submode5, &nb_submode6, &nb_submode7, &nb_submode8, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, 5, {1, 8, 2, 3, 3, 4, 4, 5, 5, 6, 7} };
- oshiete_poo_V1
- ベストアンサー率42% (15/35)
speex_nb_modeと言う名前の変数を用意してあげてください。 speex.hでは extern が付いているため、外部に実態があるようになっています。 例えば、 --- vars.c --- #include "(SppxModeの内容が書かれているヘッダファイル).h" SpeexMode speex_nb_mode = {speex_nb_modeの中身を_適_切_に_初期化します}; --- vars.c --- あなたが使っている版と同じかどうか解りませんが http://www.speex.org/docs/api/speex-api-reference/structSpeexMode.html では10個以上設定する項目があるので それらを「あなたがやりたい処理内容に合わせて」(質問には書かれておりませんので不明です)正しく初期化する必要があります。
補足
エラーが出た関数内に const SpeexMode speex_nb_mode; を追記するとビルドできました。 これでspeex_nb_modeが設定出来たかどうかは疑問ですが、どうも反映できていない気もします。 後Cのサンプルでは speex_decoder_ctl(state, SPEEX_SET_ENH, &tmp); があり、10個以上の設定は書かれていませんでしたが、2個の設定で後はデフォルトでよいのでしょうか? ちなみに以下を記述しています。 #include "speex/speex.h" #include <stdio.h> #pragma comment(lib , "static/libspeex")
- Wr5
- ベストアンサー率53% (2173/4061)
>どれかのソースファイルの1つで実体を宣言してください。 宣言と定義を間違えた。 ということで、定義してください。
補足
回答ありがとうございます。 今回は const SpeexMode speex_nb_mode; を関数内に追記することで、ビルドできました。
- Wr5
- ベストアンサー率53% (2173/4061)
>ちなみにspeex.hの記述は >/** Default narrowband mode */ >extern const SpeexMode speex_nb_mode; >となっています。 speex.hは複数のソースから利用されるのでしょう。 んで、ここの記述は…… 「SpeexMode型のspeex_nb_modeって変数が存在するよ」とコンパイラに教えていることになります。 「『どっかにある』からコンパイルエラーにしないでね♪実体の場所はリンカーさんよろしく♪」となります。 で、実体がないのでリンカーさんが「実体ないからリンクできないよぅ」となっています。 どれかのソースファイルの1つで実体を宣言してください。 # main()があるソースで…とか。実体だけをまとめたソースをプロジェクトに追加するとか。 「extern 未解決」ってキーワードでWeb検索とかしてみてください。
補足
早速の回答ありがとうございます。 今回は const SpeexMode speex_nb_mode; を追述することで解決しました。
補足
oshiete_poo_V1さん >残念ながら構造体やプロジェクトなどが根本的に解っていないのだと推測されます。 ・・・ そのとおりです。 質問するのが恥ずかしいです。 今回は、質問の state = speex_encoder_init(&speex_nb_mode); を state = speex_decoder_init(speex_lib_get_mode(SPEEX_MODEID_NB)); とすることで、エラーなくビルドできました。 Cサンプルの通り初期設定らしき記述は speex_encoder_init と speex_encoder_ctl の設定のみでエンコードとデコードが出来ていますが、事実上は問題があるでしょうか? 詳しい初期設定も勉強したと思っています。 それと、libspeex.dllが実行ファイルと同じ場所にないと、実効エラーになります。 静的リンク(マルチスレッド/MT)をしたと思うのですが、こちらも解決策をお願いします。