Неопределенная ссылка при связывании библиотеки FMOD в Linux

Я создаю простую игру в Linux на C++ и использую FMOD для звука. Недавно я загрузил последнюю версию API FMOD, однако, когда я пытаюсь использовать ее, я получаю ошибку неопределенной ссылки. Из того, что я вижу по другим связанным вопросам, обычно это связано с тем, где находится тег -lfmod при компиляции, однако независимо от того, где я помещаю этот тег, я все равно сталкиваюсь с проблемами.

Я следовал инструкциям Debian по загрузке API и библиотеки FMOD.
https://wiki.debian.org/FMOD
Однако, когда -I/usr/local/include -L/usr/local/lib не сработало, я переместил все библиотеки и файлы заголовков в локальные папки и соответствующим образом настроил.
Я использую Debian на архитектуре x86_64, если это поможет.

Я также следовал этим инструкциям здесь
https://www.fmod.com/docs/api/content/generated/platform_linux/basics.html
И с помощью ldconfig я смог убедиться, что libasound.so.2 загружен в /usr/lib/x86_64. -линукс-гну/

Я знаю об этом ответе
C++: неопределенная ссылка на "FMOD:: X"
но поскольку я компилирую с помощью G++, а библиотеки FMOD linux были скомпилированы с использованием GCC, я не думаю, что должны возникнуть проблемы.

Вот ошибка, которую я получаю при компиляции.

g++ -c audioEngine.cpp
g++ driver.o game.o uiInteract.o uiDraw.o audioEngine.o point.o velocity.o flyingObject.o ship.o bullet.o rocks.o pause.o keyBind.o asteroid.o -I/usr/local/include -L/usr/local/lib -lfmod -lglut -lGLU -lGL
audioEngine.o: In function `Implementation::Implementation()':
audioEngine.cpp:(.text+0x67): undefined reference to `FMOD::Studio::System::create(FMOD::Studio::System**, unsigned int)'
audioEngine.cpp:(.text+0x92): undefined reference to `FMOD::Studio::System::initialize(int, unsigned int, unsigned int, void*)'
audioEngine.cpp:(.text+0xbf): undefined reference to `FMOD::Studio::System::getLowLevelSystem(FMOD::System**) const'
audioEngine.o: In function `Implementation::~Implementation()':
audioEngine.cpp:(.text+0x13b): undefined reference to `FMOD::Studio::System::unloadAll()'
audioEngine.cpp:(.text+0x151): undefined reference to `FMOD::Studio::System::release()'
audioEngine.o: In function `Implementation::advance()':
audioEngine.cpp:(.text+0x2cf): undefined reference to `FMOD::Studio::System::update()'
collect2: error: ld returned 1 exit status
makefile:21: recipe for target 'a.out' failed
make: *** [a.out] Error 1

Вот проблемные места в audioEngine.cpp
В заголовочный файл включены "fmod.hpp" и "fmod_studio.hpp".

Implementation::Implementation()
{
  mpStudioSystem = NULL;
  AudioEngine::ErrorCheck(FMOD::Studio::System::create(&mpStudioSystem));
  AudioEngine::ErrorCheck(mpStudioSystem->initialize(32, FMOD_STUDIO_INIT_LIVEUPDATE, FMOD_INIT_PROFILE_ENABLE, NULL));

  mpSystem = NULL;
  AudioEngine::ErrorCheck(mpStudioSystem->getLowLevelSystem(&mpSystem));
}

Implementation::~Implementation()
{
  AudioEngine::ErrorCheck(mpStudioSystem->unloadAll());
  AudioEngine::ErrorCheck(mpStudioSystem->release());
}

void Implementation::advance()
{
  vector<ChannelMap::iterator> pStoppedChannels;
  for (auto it = mChannels.begin(), itEnd = mChannels.end(); it != itEnd; ++it)
  {
    bool bIsPlaying = false;
    it->second->isPlaying(&bIsPlaying);
    if (!bIsPlaying)
    {
      pStoppedChannels.push_back(it);
    }
  }
  for (auto& it : pStoppedChannels)
  {
    mChannels.erase(it);
  }
  AudioEngine::ErrorCheck(mpStudioSystem->update());
}

Вот соответствующая часть make-файла

LFLAGS = -I./include -L./lib -lfmod -lglut -lGLU -lGL

###############################################################
# Build the main game
###############################################################
a.out: driver.o game.o uiInteract.o uiDraw.o audioEngine.o point.o velocity.o flyingObject.o ship.o bullet.o rocks.o pause.o keyBind.o asteroid.o
    g++ driver.o game.o uiInteract.o uiDraw.o audioEngine.o point.o velocity.o flyingObject.o ship.o bullet.o rocks.o pause.o keyBind.o asteroid.o $(LFLAGS)

Файлы библиотеки .so находятся в папке «lib» в папке проекта, где находится make-файл, а файлы .h и .hpp находятся в папке «include» в том же месте.


person Medynsky    schedule 12.07.2018    source источник


Ответы (1)


Я понял ответ на этот вопрос за несколько минут до публикации, но я потратил достаточно времени, пытаясь понять это. Я все равно представляю для дальнейшего использования, если кто-то еще следует инструкциям Debian и задается вопросом, почему они получают неопределенную ссылку.

Если вы включаете файл «fmod_studio.hpp», вам также необходимо включить библиотеку fmod studio. Добавьте -lfmodstudio после -lfmod и при условии, что все остальное у вас правильно, теперь он будет компилироваться без неопределенной ссылки.

Решение настолько очевидно, что я чувствую себя идиотом. Конечно, если я хочу fmodstudio, мне нужно включить библиотеку fmodstudio! Как будто я нажимал педаль акселератора без двигателя, а потом проверял масло.

person Medynsky    schedule 12.07.2018