2

找了各种声音API库后,我决定暂时使用FMOD。

问题是,每当我尝试编译其中一个代码示例时,都会出现以下错误:

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,并且正在使用带有 GNU GCC 编译器的 Code::Blocks IDE(版本 10.05)。该项目属于“控制台应用程序”类型。fmodex.dll 文件位于我项目的文件夹中。我正在使用 Windows XP 32 位 SP3。

我已经链接到该libfmodex.a库并尝试链接到它那里的其他库,但这并不能解决问题。

因此,我的问题是,我需要做些什么来阻止这些错误的发生?就像我在使用其他库之前遇到类似的“未定义对 x 的引用”错误一样。我刚刚忘记在 Code::Blocks 中链接到它们,一旦我这样做了,它们就会起作用。

请说您是否需要有关代码等的更多信息。

4

3 回答 3

4

将 FMOD 与 Code::Blocks 一起使用时,您需要使用 C API,而不是 C++ API。FMOD 是用 Visual Studio 构建的,因此 C++ 符号使用 VC 修改方案。“Windows 的 FMOD 入门”文档中有一条注释提到了这一点。

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 回答