libconfig未定义对libconfig::Config::Config()的引用

libconfig undefined reference to libconfig::Config::Config()

本文关键字:libconfig Config 引用 未定义      更新时间:2023-10-16

我正在尝试构建一个游戏引擎,我已经转向libconfig来处理我的所有配置需求。我正在构建一个资产管理器,它将使用libconfig解析的配置文件来加载图像、声音等。

当我试图编译这个项目时,遇到了一个问题。这是导致错误的代码区域:

AssetManager::AssetManager(GameEngine *engine){
  _engine = engine;
  _config = new Config(); // <-- ERROR ( this is line 5 )
  string path = string(ASSET_DIRECTORY);
  path += "assets.cfg";
  try {
    _config->readFile( path.c_str() ); //<-- ERROR ( this is line 11 )
  } catch ( const FileIOException &fioex ){
    cout << "File exception" << endl;
  } catch ( const ParseException &pex ){
    cout << "Parse exception" << endl;
  }
}

这就是错误:

AssetManager.o: In function 'AssetManager':
/home/sean/Code/C++/Ridiculous/src/engine/AssetManager.cpp:5: undefined reference to 'libconfig::Config::Config()'
/home/sean/Code/C++/Ridiculous/src/engine/AssetManager.cpp:11: undefined reference to 'libconfig::Config::readFile(char const*)'
AssetManager.o:(.gcc_except_table+0x40): undefined reference to 'typeinfo for libconfig::ParseException'
AssetManager.o:(.gcc_except_table+0x44): undefined reference to 'typeinfo for libconfig::FileIOException'

当我第一次尝试使用libconfig时,我使用系统的包管理器下载了这个包(apt-get,我在Ubuntu 11.10上)。这不起作用,所以我尝试从项目主页下载并安装库。同样的错误。

作为参考,以下是make试图用来编译它的行(这是最后的编译阶段——将所有内容链接在一起以生成主要的可执行文件):

g++ -g -O2 -Wall -Isrc/engine/include -Isrc/engine/include/render -Isrc/engine/include/logic -I/usr/include -DVERSION="0.1" -DPROG=""Program Name"" -I/usr/include/SDL -D_GNU_SORCE=1 -D_REENTRANT -L/usr/lib -lSDL -lSDL_image -lconfig++ -o programm main.o Engine.o AssetManager.o RenderEngine.o Log.o

在过去的几个小时里,我一直在用头撞墙,试图弄清楚这一点。似乎找不到任何东西,通过谷歌,SO,或者随机尝试自己调试。运气不好。

我有一种感觉,我错过了一些超基础的东西,可能只是我对C++的有限(但正在增长!)知识可能是问题所在。或者我只是胖手指什么的。我真的不确定。

非常感谢您的帮助!(如果我弄清楚了,我会公布答案)。

附带说明:我试图用"libconfig"标记它,但显然那个标记不存在,而且我还没有足够的声誉来创建它。

编辑

事实证明这是我的自动生成/配置设置的问题。在我的Makefile.am中,我有LDFLAGS+=而不是LIBS=。显然,这(以及一个良好的睡眠)会带来巨大的不同。

*facepalm*

g++-g-L/usr/lib-lSDL-lSDL_image-lconfig++-o program main.o…

上面的命令行完全是假的。链接行上的库和对象的顺序很重要,您使用了相反的顺序。