• 締切済み

・・・は未解決です、の対策を教えてください

開発環境は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; となっています。 解決策を教えてください。 初心者ですのでそのへんよろしくお願いします。

みんなの回答

回答No.5

No.4に書いたのは http://www.speex.org/docs/api/speex-api-reference/structSpeexMode.html に書かれている第一番目の要素 const void * mode の中身だけです。

回答No.4

たぶん、以下のような初期化に何を設定すべきか解っていないというようなレベルではなく 残念ながら構造体やプロジェクトなどが根本的に解っていないのだと推測されます。 (以下を初期化したくらいで解決出来るレベルにあるとは思えません。) ~_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} };

7777777v
質問者

補足

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

回答No.3

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個以上設定する項目があるので それらを「あなたがやりたい処理内容に合わせて」(質問には書かれておりませんので不明です)正しく初期化する必要があります。

7777777v
質問者

補足

エラーが出た関数内に 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% (2177/4070)
回答No.2

>どれかのソースファイルの1つで実体を宣言してください。 宣言と定義を間違えた。 ということで、定義してください。

参考URL:
http://kurotofu.sytes.net/kanji/fool/?p=279
7777777v
質問者

補足

回答ありがとうございます。 今回は const SpeexMode speex_nb_mode; を関数内に追記することで、ビルドできました。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

>ちなみにspeex.hの記述は >/** Default narrowband mode */ >extern const SpeexMode speex_nb_mode; >となっています。 speex.hは複数のソースから利用されるのでしょう。 んで、ここの記述は…… 「SpeexMode型のspeex_nb_modeって変数が存在するよ」とコンパイラに教えていることになります。 「『どっかにある』からコンパイルエラーにしないでね♪実体の場所はリンカーさんよろしく♪」となります。 で、実体がないのでリンカーさんが「実体ないからリンクできないよぅ」となっています。 どれかのソースファイルの1つで実体を宣言してください。 # main()があるソースで…とか。実体だけをまとめたソースをプロジェクトに追加するとか。 「extern 未解決」ってキーワードでWeb検索とかしてみてください。

7777777v
質問者

補足

早速の回答ありがとうございます。 今回は const SpeexMode speex_nb_mode; を追述することで解決しました。

関連するQ&A

  • Visual Studio2008でヘッダファイルが更新されない

    C++で、単純な計算プログラムを作成しています。 main.cとinit.hの2つのファイルで構成しています。2つとも、プロジェクトの親フォルダに入っています。 ヘッダファイルを変更して、ソリューションのリビルドをしても、ヘッダファイルの変更が反映されません。 構造体をヘッダファイルに記載していて、メンバを追加してリビルド後も反映されません。#defineでヘッダに記載していた定数を変数に変更しようとして、define文を消してリビルドしても、その値がずっと定数のままになってしまいます。 init.hファイルのファイル名をinit2.hに変更して、includeファイルも#include "init2.h"に書き換えてビルドすると反映されます。非常に不思議です。どこかVisual Studioの設定のような気がするのですが、環境設定の方法がわからず困っております。 どなたかご教示・ヒント・キーワード等よろしくお願いします。

  • VC++2010の「#include <」

    VC++ で、他人の作ったソースコードをビルドして実行してみています。 (WinPcapのデベロッパ向けのライブラリを使った、サンプルプログラムです。) VC++自体、あまり理解が深くないのですが、 「#include <」まで書くと、「ヘッダファイル名が表示される」プロジェクトと、「そうではない」プロジェクトがあります。 「そうではない」方のプロジェクトだと、ビルド時にincludeするライブラリが足りないとか、そんな感じのエラーが表示されます。 ぱっと見の違いは、「ヘッダファイル名が表示される」プロジェクトの場合は、 ソリューションエクスプローラに、「外部依存関係」というフォルダのショートカットがあり、ライブラリがどっさりあります。 「そうではない」プロジェクトについても、「#include <」で、ヘッダファイルを表示してくれるようにしたいのですが、どの様にすればよいのでしょうか?★ プロジェクトのプロパティの、 C++>プリプロセッサ>プリプロセッサの定義 リンカー>入力>追加の依存ファイル はどちらのソースも同じにしたのですが…。

  • ヘッダファイルにおける文字列リソース定義

    C言語(主にVC++)で開発をしていると、よく、 const char MSG_HELLO[] = "HELLO!"; のように、ヘッダファイル中で、文字列リテラルを定義します。 自分もいつのまにかこのようにリソース定義するようになっていましたが、初期の頃から疑問だったのは、extern宣言せずにchar配列を宣言しているから、コンパイラが最適化しなかったら、上記宣言のあるヘッダファイルを読み込んで、その定義を使った個所のあるソース分文字列リテラルがメモリ上に確保されてしまうのではないか、、?ということです。 つまり、本来なら const char* MSG_HELLO[] = "HELLO!"; とソースファイル中で定義し、ヘッダファイルには extern const char* MSG_HELLO; とすべきではないか、と思うわけです。ただ実際にこれをやっているとヘッダとソースの両方のメンテナンスが必要になるので、冒頭のように記述しているのだと思いますが。 この、本来なら下記のようにすべきだが、コンパイラの最適化(リソースのプール)を期待して最初のように書いている、という解釈は正しいでしょうか?

  • グローバル変数

    分割コンパイルで、持ちいる変数をヘッダーファイルに宣言しました。 ヘッダーファイル内で次のように宣言し、メインの関数でない場合にはexternになるようにしました。 メインなら FILEは1 それ以外なら0 #if FILE   unsinged int inputNo; #else  extern unsigned int inputNo; #endif しかし、リンクをさせると error LNK2001: 外部シンボル "_inputNo" は未解決です と出てしまいます。解決策はあるでしょうか? プロジェクトの設定の関係でしょうか?よろしくお願い致します。

  • 定義されているのにエラーになる

    閲覧ありがとうございます。 C言語のプログラムの話です。 ソースファイルaaa.cでstdio.hをincludeしています。 stdio.hには extern FILE _iob[_NIOBRW]; というのが定義されているにも関わらず、 コンパイルすると、 aaa.o:aaa.c:(.data+0x58): undefined reference to '_iob' というエラーが出ます。 aaa.cでは_iobに関する宣言はしていませんが、それを使うこともしていません。 ヘッダファイルでexternで宣言してるからかなと思い、ソースファイルにexternなしの宣言を書き足したら、コンパイルは通りました。 今回は元々既にあるプロジェクトの改修だったのですが、宣言を消したりしていません。 しかし、その部分は元々ヘッダファイルに宣言などしなくてもコンパイルが通ってました。 昔はヘッダファイルでexternで宣言してたらソースファイルではしなくてオッケーみたいな感じだったんですかね? 私自身、あまりよく分かってなくて文章もめちゃくちゃですみません。 不足している情報があればできる範囲でお伝えしますので、ご協力よろしくお願いいたします。

  • extern "C"が原因?

    今、自分のソースから既存の(sample.h)をインクルードし、 そのヘッダファイルの変数を用いようと思っているのですが、 「error LNK2001: 外部シンボル "ID_WMP" は未解決です。」というエラーが出ます。 (sample.h) extern "C" const GID ID_WMP 自分のソース(my.h)で、このID_WMPを使用すると、上記のエラーがでます。 困っています。よろしくお願い致します。

  • PBC Library

    PBC LibraryのVC版を使用したいのですが、「PBCVC」フォルダ内のプロジェクトファイルを開き、ビルドすると "gmp.h"が開けませんというエラーが出ます。 よくみると、「PBCVC」フォルダ内の「self-compiled」フォルダ内にgmp.hがあります。 そこで、プロジェクトにgmp.hを追加したのですが、同じエラーが出ます。 どうすれば解決するでしょうか? 宜しくお願いいたします。 PBC Library http://crypto.stanford.edu/pbc/download.html

  • BCBでVC++のDLLを利用するために

    C++Builder5で、VC++で作ったDLLを利用する必要に駆られてしまいました。 提供されているのはDLL本体とヘッダの2点で、BCBからリンクするために、implibを使ってdllからlibの作成をし、プロジェクトに加え、ヘッダをインクルードしました。続けて試しにコードを書いたところ、 '外部シンボル_initialize_libraryが未解決' との表示。(initialize_libraryとはDLL内にある関数です。) 調べてみたところ、 1.呼び出し規約は標準で __stdcall 2.VC++ では、_ がシンボル名の頭に付く 3.Builder ではつかない これで食い違いが生じているんだと思うのですが、更に調べると、モジュール定義ファイルにて再定義をすれば良いとの結論になりました。 BorlandのFAQも見たのですが、書式が理解できなくて・・・そこで質問させて頂きたいのですが、単純にproject名.defを作って、 >IMPORTS >initialize_library=_initialize_library とやってプロジェクトに加えれば良いのでしょうか? ソース本体にextern "C" というのも必要なようですが、こちらの記述も教えて頂けたら嬉しいです。

  • 分割ファイルのコンパイル

    $gcc Bprop.c init.c prop.c state.c head.h main.c memory.c read.c -lm -g 以上のように複数のファイルをコンパイルしたら以下のようなエラーが表示されました。 gcc: compilation of header file requested この場合は自分で作成しているヘッダファイルに問題があるのでしょうか?またヘッダファイル内では以下のヘッダを読み込んでいます。 stdio.h string.h stdlib.h math.h time.h ヒントをよろしくお願いします。

  • VC++2008でのサンプルプログラムのビルド

    VC++2008を使用してWin32APIを使ったプログラムを動かしたいと思っている者です。 これまでC言語については多少学んできましたがC++を使用するのは初めてです。 まずはサンプルプログラムを動かそうと思い以下のソースを入力しました。 #include <windows.h> #include <tchar.h> int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd) { MessageBox( NULL, _T("Hello World"), _T("メッセージ"), MB_OK ); return 0; } そしてこれをビルドしてみたところエラーメッセージがでてしまいうまくビルドできませんでした。 参考にしているHPはVC++2008での作業を推奨していたので、動作環境の違いなどではないと思うのですが… 初期設定等の問題になるのでしょうか?解決策があれば教えていただきたいです。 以下が表示されるエラーメッセージです。 1>1.obj : error LNK2028: 未解決のトークン (0A000044) "extern "C" int __stdcall MessageBoxW(struct HWND__ *,wchar_t const *,wchar_t const *,unsigned int)" (?MessageBoxW@@$$J216YGHPAUHWND__@@PB_W1I@Z) が関数 "extern "C" int __cdecl MessageBox(struct HWND__ *,wchar_t const *,wchar_t const *,unsigned int)" (?MessageBox@@$$J0YAHPAUHWND__@@PB_W1I@Z) で参照されました。 1>1.obj : error LNK2019: 未解決の外部シンボル "extern "C" int __stdcall MessageBoxW(struct HWND__ *,wchar_t const *,wchar_t const *,unsigned int)" (?MessageBoxW@@$$J216YGHPAUHWND__@@PB_W1I@Z) が関数 "extern "C" int __cdecl MessageBox(struct HWND__ *,wchar_t const *,wchar_t const *,unsigned int)" (?MessageBox@@$$J0YAHPAUHWND__@@PB_W1I@Z) で参照されました。 1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\1\Debug\1.exe : fatal error LNK1120: 外部参照 2 が未解決です。

専門家に質問してみよう