我正在尝试构建一个游戏引擎,我已经转向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'来标记这个,但显然该标签不存在,我还没有足够的声誉来创建它。
修改
原来我的automake / configure设置存在问题。在我的Makefile.am中,我有LDFLAGS+=
而不是LIBS=
。显然(和一个美好的夜晚的睡眠)产生了巨大的差异。
*捂脸*
答案 0 :(得分:4)
g ++ -g ... -L / usr / lib -lSDL -lSDL_image -lconfig ++ -o programm main.o ...
以上命令行完全是假的。链接行matters上的库和对象的顺序,并且您使用相反的顺序。