C++: неопределенная ссылка на FMOD:: X

Осмотрев различные библиотеки звукового 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 и использую IDE Code::Blocks (версия 10.05) с компилятором GNU GCC. Проект относится к типу "Консольное приложение". Файл fmodex.dll находится в папке моего проекта. Я использую Windows XP 32 бит SP3.

Я связался с libfmodex.a библиотеку и попытался связать ее с другими библиотеками, но это не решает проблему.

Поэтому мой вопрос: что мне нужно сделать, чтобы эти ошибки не возникали? Как и когда я сталкивался с подобными ошибками "Неопределенная ссылка на x" перед использованием других библиотек. Я просто забыл ссылаться на них в Code::Blocks, и как только я это сделаю, они будут работать.

Скажите, если вам нужна дополнительная информация о коде и т. Д.

3 ответа

Решение

При использовании FMOD с Code::Blocks вам нужно использовать C API, а не C++ API. FMOD построен с Visual Studio, поэтому символы C++ используют схему искажения VC. В документе "Начало работы с FMOD для Windows" есть примечание, в котором упоминается это.

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

У меня нет коробки 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\ к вашему списку включаемых путей и включайте файлы по имени файла вместо полного пути; тогда ваш код может скомпилироваться где-то, кроме вашего конкретного компьютера!)

Эти неопределенные ошибки ссылок означают, что компилятор, или, скорее, компоновщик, не может найти библиотеку.

Я не использую Code::Blocks, поэтому я не знаю, где находится настройка, но вы должны указать своему проекту использовать библиотеку и где ее найти.

Достаточно просто поместить DLL в каталог, чтобы запустить программу, но для ее связывания нужен файл.lib.

Другие вопросы по тегам