我已经从github成功构建了SFML,其中包含库和运行时的静态链接(从网站下载的那个动态链接到运行时,这要求用户在与Visual Studio一起使用时安装msvcrXXX.dll)。它工作正常,直到我开始使用我的代码。
问题是sf::RenderWindow::draw
,当用sf::RectangleShape
之类的东西调用时,它没有问题,并显示漂亮的彩色矩形。但是,当我开始使用我自己的类时,它会弹出一个错误。
类层次结构:
有一个基类如下:
class ButtonBase : public sf::Drawable{
public:
virtual ~ButtonBase() {}
virtual void callback(ButtonClickState) = 0;
virtual void onHover(HoverState) = 0;
virtual void draw(sf::RenderTarget&, sf::RenderStates) const = 0;
virtual sf::Sprite& getBackground() const = 0;
virtual LabelBase& getLabel() const = 0;
virtual TooltipBase& getTooltip() const = 0;
virtual void hide() = 0;
virtual void show() = 0;
virtual bool isHidden() const = 0;
virtual int getZ() const = 0;
virtual void setZ(int) = 0;
};
正如您所看到的,此类继承了sf :: Drawable,因此可以以某种方式使用继承ButtonBase的所有Buttons:window.draw(buttonInstance);
。
按钮看起来大致如下:
class Button final : public ButtonBase{
mutable Label label;
sf::Texture texture;
mutable sf::Sprite buttonImage;
mutable int z;
bool active;
public:
//constructors, destructors, whatnot
void draw(sf::RenderTarget& target, sf::RenderStates states) const
{
if (active)
{
target.draw(buttonImage, states);
target.draw(label, states);
//target.draw(bTltp, states);
}
}
//more stuff
};
大多数东西都无关紧要。我将问题归结为在函数返回/超出范围后调用Button
内的绘图时,弹出此错误:
运行时检查失败#0 - ESP的值未在函数调用中正确保存。这通常是调用使用一个调用约定声明的函数的结果,函数指针使用不同的调用约定声明。
我使用默认的:cdecl约定。使用一些奇怪/其他约定,SFML是否使用SFML_LINK_STD_STATICALLY(或CMake中的那个标志调用)构建为真?
要注意,我已在预处理器宏中定义了SFML_STATIC标志,并且我使用了正确的(调试调试,普通版本和发布版本)库。
我非常确定此代码可以与从官方网站下载的动态链接库一起使用,因为我已经使整个项目完全有效。