【问题标题】:SFML loadFromFile undefined referenceSFML loadFromFile 未定义参考
【发布时间】:2015-12-02 07:25:39
【问题描述】:

我正在学习使用 SFML 来制作一个小游戏,到目前为止,我已经创建了一个窗口并弄乱了它的设置,并设置了一个绘制循环和事件处理程序。

当我尝试使用以下代码添加我的第一个纹理时,问题就开始了:

#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 库是否都包含在构建选项中(我正在使用带有 GCC MinGW 的 code::Blocks)。

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

我见过的其他主题涉及对人们自己创建的函数的未定义引用,但这里我使用的是库。

编辑:我刚刚尝试使用同一个库中的基本形状:

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

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

    Engine.AddEntity(shape, 5);

编译和显示没有问题。

【问题讨论】:

  • 但是,我必须补充一点,即使您修复了未定义的引用错误,您也会面临white square problem。此外,我认为尽可能使用堆并不是一个好的设计。为什么你的sf::Sprite-Instance 不在堆栈上?
  • 这个想法是让背景或按钮等对象的实现与绘图循环分开,其中绘图循环只有一个指向它需要绘制的对象的指针。这里的对象实现根本还没有实现。如果我把它放在堆栈中,它会在它被绘制时被清理干净。
  • 你的纹理在绘制之前会被清理干净。精灵只有一个指向纹理的指针,而不是纹理本身的完整副本。因此你会遇到纹理不会被绘制。
  • 你链接了吗。除了sfml-graphicssfml-system,还有吗?
  • 我添加了一张图片drive.google.com/file/d/0B4qzXcgqbLZtcHJWUy1vSUhpdVk/view,您可以在其中看到我如何链接 sfml-audio-d、sfml-graphics-d、sfml-window-d 和 sfml-system-d

标签: c++ sfml


【解决方案1】:

您使用的 SFML 库是使用不同的运行时或不同的运行时 ABI 编译的,而不是您链接应用程序所针对的。

如果您的 SFML 库不是使用您拥有的相同编译器编译的,那么您需要重新构建。

如果您在应用程序上设置了任何特殊标志(例如,不同的 ABI、C++14 等),您也必须使用相同的标志重新构建 SFML,或者将它们从您的项目中删除。

而且它有时只会发生,因为它不会影响整个运行时库,但会影响像 std::string 这样的部分,它们在调用 loadFromFile 函数时会被使用。

【讨论】:

  • 谢谢,我之前使用过预编译库,尝试从提供常量的源代码进行编译。引导我安装重新编译的新 MinGW 安装,最终解决了问题。
  • 对于仍在为这个问题苦苦挣扎的人:我发现 SFML 必须针对 libjpeg-turbo 进行编译,NOT libjpeg。这就是loadFromFile 失败的原因。 (如果你使用 ArchLinux,你需要安装 aur/mingw-w64-libjpeg-turbo 包,然后重建 aur/mingw-64-sfml。经过几个小时的努力为我工作!
  • 那是不是正确的。 libjpeg-turbolibjpeg 共享相同的 API,因此您显然可以使用任一版本。您只需确保使用 8.x API 版本而不是 9.x。而且我非常怀疑您是否遇到与 OP 相同的错误,因此您的评论在这里甚至不相关。
猜你喜欢
  • 1970-01-01
  • 2014-02-25
  • 2023-03-30
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 2014-12-16
  • 2015-01-14
  • 2023-03-08
相关资源
最近更新 更多