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

c++ codeblocks undefined-reference fmod

3849 просмотра

3 ответа

Осмотрев различные библиотеки 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, и как только я это сделаю, они будут работать.

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

Автор: James Источник Размещён: 12.11.2019 09:23

Ответы (3)


4 плюса

Решение

При использовании 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

Автор: Mathew Block Размещён: 14.03.2011 11:22

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

Автор: Nicholas Knight Размещён: 14.03.2011 08:11

0 плюса

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

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

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

Автор: Zan Lynx Размещён: 14.03.2011 08:15
Вопросы из категории :
32x32