2012-03-06 3 views
2

Я пытаюсь создать игровой движок, и я перешел на libconfig для обработки всех моих потребностей в конфигурации. Я в процессе создания менеджера активов, который будет использовать файлы конфигурации, обработанные libconfig, для загрузки изображений, звуков и т. Д.libconfig undefined ссылка на libconfig :: Config :: Config()

У меня возникает проблема, когда я пытаюсь скомпилировать проект. Это область кода, который вызывает ошибку:

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). Это не сработало, поэтому я попытался загрузить и установить библиотеку с домашней страницы проекта. Такая же ошибка.

Для справки, вот линия, которые делают пытается использовать для компиляции (это заключительный этап компиляции - связывая все вместе, чтобы сделать основной исполняемый файл):

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», но, по-видимому, этого тега не существует, и у меня нет достаточной репутации для его создания.

EDIT

Оказывается, это была проблема с моей установки Automake/конфигурирования. В моем Makefile.am у меня было LDFLAGS+= вместо LIBS=. Видимо, это (и хороший ночной сон) имеет огромное значение.

* Facepalm *

+1

Можете ли вы скомпилировать и запустить примеры программ, которые поставляются с libconfig? http://www.hyperrealm.com/libconfig/libconfig_manual.html#Example-Programs –

+0

@DrTwox: вы указали мне в правильном направлении. Оказывается, мой make-файл был неправильным (ну, Makefile.am). Это то, что я пытаюсь делать целыми богами, изучая программную цепочку automake/configure в то же самое время, когда я пытаюсь использовать новые библиотеки. –

ответ

4

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

Над командной строки полностью поддельным. Порядок библиотек и объектов на линии связи matters, и вы использовали напротив порядок того, что должно быть.

Смежные вопросы