dポイントプレゼントキャンペーン実施中!

開発環境は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;
となっています。

解決策を教えてください。
初心者ですのでそのへんよろしくお願いします。

A 回答 (5件)

たぶん、以下のような初期化に何を設定すべきか解っていないというようなレベルではなく


残念ながら構造体やプロジェクトなどが根本的に解っていないのだと推測されます。
(以下を初期化したくらいで解決出来るレベルにあるとは思えません。)
~_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さん
>残念ながら構造体やプロジェクトなどが根本的に解っていないのだと推測されます。
・・・
そのとおりです。
質問するのが恥ずかしいです。

今回は、質問の
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)をしたと思うのですが、こちらも解決策をお願いします。

補足日時:2014/05/05 15:49
    • good
    • 0

No.4に書いたのは


http://www.speex.org/docs/api/speex-api-referenc …
に書かれている第一番目の要素 const void * mode の中身だけです。
    • good
    • 0

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-referenc …
では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")

補足日時:2014/05/02 10:54
    • good
    • 0

>どれかのソースファイルの1つで実体を宣言してください。



宣言と定義を間違えた。
ということで、定義してください。

参考URL:http://kurotofu.sytes.net/kanji/fool/?p=279

この回答への補足

回答ありがとうございます。

今回は
const SpeexMode speex_nb_mode;
を関数内に追記することで、ビルドできました。

補足日時:2014/05/02 10:39
    • good
    • 0

>ちなみに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;
を追述することで解決しました。

補足日時:2014/05/02 10:35
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!