3

私はゲームエンジンを構築しようとしていますが、すべての構成ニーズを処理するために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

私はこれを理解しようとして、ここ数時間壁に頭をぶつけてきました。Google、SO、または自分でこれをランダムにデバッグしようとしても、何も見つからないようです。運がない。

私は非常に基本的なものが欠けていると感じています。問題になるのは、C ++に関する私の限られた(しかし成長している!)知識だけである可能性があります。あるいは、私は何かを太く指で触れただけかもしれません。よくわかりません。

どんな助けでも大歓迎です!(そして私がそれを理解したら、私は答えを投稿します)。

補足:これに「libconfig」のタグを付けようとしましたが、明らかにそのタグは存在せず、まだ作成するのに十分な評判がありません。

編集

それは私のautomake/configureセットアップの問題であることがわかりました。私のMakefile.amでは、LDFLAGS+=の代わりに持っていましたLIBS=。どうやらそれ(そしてぐっすり眠る)は大きな違いを生む。

* facepalm *

4

1 に答える 1

5

g++ -g ... -L/usr/lib -lSDL -lSDL_image -lconfig++ -o プログラム main.o ...

上記のコマンドラインは完全に偽物です。リンク行のライブラリとオブジェクトの順序は重要であり、本来あるべき順序とは逆の順序を使用しました。

于 2012-03-07T05:17:37.100 に答える