2

いろいろなサウンド API ライブラリを調べた結果、とりあえず FMOD を使用することにしました。

問題は、コード例の 1 つをコンパイルしようとするたびに、次のエラーが発生することです。

obj\Release\main.o:main.cpp|| undefined reference to `FMOD::System::getVersion(unsigned int*)@8'|

obj\Release\main.o:main.cpp|| undefined reference to `FMOD::System::init(int, unsigned int, void*)@16'|

obj\Release\main.o:main.cpp|| undefined reference to `FMOD::System::createSound(char const*, unsigned int, FMOD_CREATESOUNDEXINFO*, FMOD::Sound**)@20'|

obj\Release\main.o:main.cpp|| undefined reference to `FMOD::Sound::setMode(unsigned int)@8'|

私が使用しているコード例は次のとおりです。

#include <D:\Games\FMOD Programmers API Win32\api\inc\fmod.hpp>
#include <D:\Games\FMOD Programmers API Win32\api\inc\fmod_errors.h>
#include <sstream>
#include <windows.h> // for PlaySound()
#include <time.h>
#include <mmsystem.h>    
using namespace std;
int main(int argc, char* argv[])
{
FMOD::System     *system;
FMOD::Sound      *sound1, *sound2, *sound3;
FMOD::Channel    *channel = 0;
FMOD_RESULT       result;
int               key;
unsigned int      version;

/*
    Create a System object and initialize.
*/
result = FMOD::System_Create(&system);


result = system->getVersion(&version);

result = system->init(32, FMOD_INIT_NORMAL, 0);


result = system->createSound("../media/drumloop.wav", FMOD_HARDWARE, 0, &sound1);


result = sound1->setMode(FMOD_LOOP_OFF);    /* drumloop.wav has embedded loop points   which automatically makes looping turn on, */
                                            /* so turn it off here.  We could have also just put FMOD_LOOP_OFF in the above CreateSound call. */

 // Code continues into other bits that work...

FMOD の最新バージョンを使用しており、Code::Blocks IDE (ver 10.05) と GNU GCC コンパイラを使用しています。プロジェクトのタイプは「コンソール アプリケーション」です。fmodex.dll ファイルは、私のプロジェクトのフォルダーにあります。Windows XP 32 ビット SP3 を使用しています。

ライブラリにリンクlibfmodex.aし、そこにある他のライブラリにもリンクしようとしましたが、問題は解決しません。

したがって、私の質問は、これらのエラーの発生を止めるために何をする必要があるかということです。他のライブラリを使用する前に、同様の「x への未定義参照」エラーが発生したときと同様です。Code::Blocks でそれらにリンクするのを忘れていたのですが、リンクするとすぐに機能するようになりました。

コードなどに関する詳細情報が必要な場合は言ってください。

4

3 に答える 3

4

Code::Blocks で FMOD を使用する場合、C++ API ではなく、C API を使用する必要があります。FMOD は Visual Studio でビルドされるため、C++ シンボルは VC マングリング スキームを使用します。「Getting Started with FMOD for Windows」ドキュメントには、これについて言及されているメモがあります。

http://en.wikipedia.org/wiki/Name_mangling#How_different_compilers_mangle_the_same_functions

于 2011-03-14T23:22:31.463 に答える
1

これを検証する準備ができている Windows ボックスはありませが、インクルード パスでこれらのバックスラッシュをスラッシュに置き換えるか、バックスラッシュをエスケープしてみてください。

#include <D:/Games/FMOD Programmers API Win32/api/inc/fmod.hpp>
#include <D:/Games/FMOD Programmers API Win32/api/inc/fmod_errors.h>

また

#include <D:\\Games\\FMOD Programmers API Win32\\api\\inc\\fmod.hpp>
#include <D:\\Games\\FMOD Programmers API Win32\\api\\inc\\fmod_errors.h>

(または、D:\Games\FMOD Programmers API Win32\api\inc\インクルード パスのリストに追加し、フル パスではなくファイル名でファイルをインクルードすることをお勧めします。そうすれば、コードは実際には特定のコンピューター以外の場所でコンパイルされる可能性があります!)

于 2011-03-14T20:11:40.797 に答える
0

これらの未定義の参照エラーは、コンパイラ、またはコンパイラのリンカー部分がライブラリを見つけられないことを意味します。

私は Code::Blocks を使用していないので、設定がどこにあるのかわかりませんが、ライブラリを使用するようにプロジェクトに指示し、その場所を見つける必要があります。

DLL をディレクトリに置くだけでプログラムを実行できますが、リンクするには .lib ファイルが必要です。

于 2011-03-14T20:15:38.537 に答える