2015-09-06 2 views
1

Я изучаю использование SFML с идеей создания небольшой игры, до сих пор я создал окно и испортил его настройками, а также создал цикл рисования и обработчик событий.SFML loadFromFile undefined reference

Проблемы начались, когда я пытался добавить свою первую текстуру, используя следующий код:

#include "SpaceNomad.ih" 

void MainMenu(GameEngine &Engine) 
{ 
    sf::Texture texture; 

    if(!texture.loadFromFile("MenuBackGround.png")) 
    { 
     cout << "couldn't load background texture\n"; 
    } 

    sf::Sprite *sprite = new sf::Sprite; 
    sprite->setTexture(texture); 

    Engine.AddEntity(sprite, 5); 
} 

, который находится за пределами другого изображения буквально пример кода, указанному на SFML tutorial page.

Когда я пытаюсь скомпилировать это я получаю следующее сообщение об ошибке:

||=== Build: Debug in space nomad (compiler: GNU GCC Compiler) ===| 
obj\Debug\projects\st\take2\MainMenu.o||In function  `Z8MainMenuR10GameEngine':| 
D:\projects\st\take2\MainMenu.cpp|7|undefined reference to `_imp___ZN2sf7Texture12loadFromFileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_4RectIiEE'| 
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===| 

Я проверил, что все библиотеки SFML включены в опции сборки (я использую код :: Blocks с MinGW GCC) ,

https://drive.google.com/file/d/0B4qzXcgqbLZtcHJWUy1vSUhpdVk/view?usp=sharing

Другие темы я видел много с неопределенными ссылками на функции людей, которые сделали себя, но здесь я использую библиотеку.

редактировать: Я просто попытался с основной формой от того же libary:

sf::CircleShape *shape = new sf::CircleShape(50); 

    // set the shape color to green 
    shape->setFillColor(sf::Color(100, 250, 50)); 

    Engine.AddEntity(shape, 5); 

Который собирает и отображает без проблем.

+0

Однако я должен добавить, что даже если вы исправите эту неопределенную ошибку ссылки, вы столкнетесь с проблемой «белого квадрата». Кроме того, я не думаю, что это хороший дизайн, чтобы использовать кучу всякий раз, когда вы можете. Почему ваш 'sf :: Sprite'-Instance не находится в стеке? – NaCl

+0

идея заключалась в том, чтобы сохранить реализацию объектов, подобных фону или кнопкам, и отдельному циклу рисования, где цикл рисования имеет только указатель на объекты, которые ему нужно рисовать. Здесь реализация объекта просто еще не реализована. Если бы я положил его в стек, он бы был очищен к тому времени, когда он был бы нарисован. –

+0

Ваша текстура очищается до нарисованного. Спрайт имеет только указатель на текстуру, а не всю копию самой текстуры. Таким образом, вы получите то, что текстура не будет нарисована. – NaCl

ответ

1

Вы используете библиотеки SFML, которые были скомпилированы с другой версией или другим исполняемым ABI, чем вы связываете приложение.

Если ваши библиотеки SFML не были скомпилированы с тем же компилятором, что и у вас, вам необходимо перестроить.

Если вы установили какие-либо специальные флаги в своем приложении (например, разные ABI, C++ 14 и т. Д.), Вам придется перестроить SFML с теми же флагами или удалить их из вашего проекта.

Также это происходит иногда, потому что это не влияет на все библиотеки времени выполнения, но такие части, как std::string, которые используются при вызове функции loadFromFile.

+0

Спасибо, раньше я использовал предварительно скомпилированные библиотеки, попытался выполнить компиляцию из источников, которые дали константу.что привело меня к установке новой установки MinGW, перекомпилированной с той, которая, наконец, устранила проблему. –

+0

Для людей, которые все еще борются с этой проблемой: я выяснил, что SFML должен быть скомпилирован против 'libjpeg-turbo', ** NOT **' libjpeg'. Вот почему 'loadFromFile' не работает. (Если вы используете ArchLinux, вам нужно установить пакет 'aur/mingw-w64-libjpeg-turbo', а затем перестроить' aur/mingw-64-sfml'. Работал для меня после долгих часов! –

+0

Это ** NOT ** true. 'libjpeg-turbo' и' libjpeg' используют один и тот же API, поэтому вы, очевидно, можете использовать любую версию. Все, что вам нужно, чтобы убедиться, что вы используете версию API 8.x, а не 9.x. И я очень сомневаюсь, что вы получили те же ошибки, что и OP, поэтому ваш комментарий здесь даже не уместен. – Lukas