C ++: неопределенная ссылка на FMOD :: X - PullRequest
2 голосов
/ 14 марта 2011

Осмотрев различные звуковые библиотеки 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 находится в папке моего проекта.Я использую 32-разрядную версию Windows XP с пакетом обновления 3 (SP3).

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

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

Ответы [ 3 ]

4 голосов
/ 15 марта 2011

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

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

1 голос
/ 14 марта 2011

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

0 голосов
/ 14 марта 2011

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

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

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

...