在Linux上链接FMOD库时的未定义参考

时间:2018-07-12 08:35:08

标签: c++ linux reference undefined fmod

我正在用C ++在Linux上创建一个简单的游戏,并使用FMOD进行声音播放。我最近下载了最新的FMOD API,但是当我尝试使用它时,出现未定义的参考错误。从其他相关问题来看,通常与-lfmod标记在编译时的位置有关,但是无论我将该标记放在何处,我仍然会遇到问题。

我按照Debian的说明下载了FMOD api和库。
https://wiki.debian.org/FMOD
但是,当-I/usr/local/include -L/usr/local/lib不起作用时,我将所有库和头文件都移到了本地文件夹,并进行了相应的调整。
如果有帮助,我可以在x86_64架构上使用Debian。

我也在这里遵循了这些说明
https://www.fmod.com/docs/api/content/generated/platform_linux/basics.html
并使用ldconfig可以验证是否在/ usr / lib / x86_64-linux-gnu /

中下载了libasound.so.2。

我知道这个答案
C++:Undefined reference to '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());
}

这是makefile的相关部分

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库文件位于makefile所在项目文件夹的“ lib”文件夹中,.h和.hpp文件位于同一位置的“ include”文件夹中。

1 个答案:

答案 0 :(得分:0)

我在发帖之前就意识到了这个问题的答案,但是我花了足够的时间试图弄清楚,如果有人遵循Debian的说明,我正摆着将来的参考书,并想知道为什么他们得到了未定义的参考书。

如果要包括“ fmod_studio.hpp”文件,则还需要包括fmod工作室库。在-lfmodstudio之后添加-lfmod,并提供其他所有可用的条件,现在可以在编译时使用未定义的引用。

解决方案是如此明显,我觉得自己是个白痴。当然,如果我想要fmodstudio,则需要包括fmodstudio库!就像我在没有引擎的情况下踩下油门踏板然后检查机油一样。