2015-09-06 48 views
1

我学习使用SFML与制作小游戏的想法,到目前为止,我已经创建了一个窗口和混乱有关它的设置,并设置了抽奖循环和事件处理程序。SFML loadFromFile未定义参考

麻烦启动一次我试着用下面的代码添加到我的第一个纹理:

#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库都包含在构建选项(我使用的代码::与海湾合作委员会MinGW的块) 。

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

不过,我要补充的是,即使你修复未定义引用错误,你将面对的'白色正方形problem'。我也不认为这是一个好的设计,只要你可以使用堆。为什么你的'sf :: Sprite'-Instance不在堆栈上? – NaCl

+0

这个想法是保持背景或按钮等对象的执行以及绘制循环的分离,其中绘制循环只有一个指向它需要绘制的对象的指针。这里的对象实现还没有实现。如果我把它放在堆栈中,它会在它被绘制的时候被清理干净。 –

+0

您的纹理在绘制前被清理干净。精灵只有一个指向纹理的指针,而不是纹理本身的整个副本。因此你会注意到纹理不会被绘制。 – NaCl

回答

1

你使用的是具有不同的运行时或不同的运行时ABI编译SFML库比你链接您对应用程序。

如果您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,所以你明显可以使用任何一个版本,所有你需要确保你使用8.x API版本而不是9.x。非常怀疑你得到了与OP相同的错误,所以你的评论在这里甚至没有关系。 – Lukas