【发布时间】:2014-10-09 16:35:41
【问题描述】:
问题描述:
我正在制作一个在每个实例中都有一个 sf::Sprite(cartSprite) 的 Cart 类。但是,生成购物车的静态 sf::Texture(cartTexture) 在所有购物车对象之间共享。在构建购物车时,从纹理加载精灵。
根据the documentation,sf::Texture 有一个默认构造函数:
创建一个空纹理。
但是,当我编译下面声明但未定义 sf::Texture 的代码时,我收到链接器错误:
/tmp/cclJ5hJp.o: In function `Cart::Cart(sf::Vector2<float> const&, sf::Color, float)':
main.cpp:(.text._ZN4CartC2ERKN2sf7Vector2IfEENS0_5ColorEf[_ZN4CartC5ERKN2sf7Vector2IfEENS0_5ColorEf]+0x46): undefined reference to `Cart::cartTexture'
main.cpp:(.text._ZN4CartC2ERKN2sf7Vector2IfEENS0_5ColorEf[_ZN4CartC5ERKN2sf7Vector2IfEENS0_5ColorEf]+0x87): undefined reference to `Cart::cartTexture'
main.cpp:(.text._ZN4CartC2ERKN2sf7Vector2IfEENS0_5ColorEf[_ZN4CartC5ERKN2sf7Vector2IfEENS0_5ColorEf]+0x9b): undefined reference to `Cart::cartTexture'
main.cpp:(.text._ZN4CartC2ERKN2sf7Vector2IfEENS0_5ColorEf[_ZN4CartC5ERKN2sf7Vector2IfEENS0_5ColorEf]+0xb6): undefined reference to `Cart::cartTexture'
collect2: error: ld returned 1 exit status
这是否意味着我应该初始化(定义)cartTexture?如果是这样,当sf::Texture 的唯一构造函数是“从另一个sf::Texture 复制”和上面提到的构造函数时,我该如何在编译时执行此操作?我不能使用函数调用来加载图像,对吧?
编译代码: g++ main.cpp -Wall -Wextra -Werror -std=c++11 -lsfml-graphics -lsfml-window -lsfml-system -o exec
代码:
main.cpp:
#include <SFML/Graphics.hpp>
#include <string>
#include <iostream>
#include <mutex>
class Cart : public sf::Drawable {
public:
// Constructor- create with position, orientation, and color.
Cart(const sf::Vector2f& cartPos_, sf::Color cartColor_, float cartAngle_) {
if (!cartTexture.loadFromFile(textureLoc)) {
std::cout << "File is nonexistent." << std::endl;
} else {
cartTexture.setSmooth(true);
cartTexture.setRepeated(false);
}
cartSprite.setTexture(cartTexture);
cartSprite.setPosition(cartPos_);
cartSprite.setRotation(cartAngle_);
cartSprite.setColor(cartColor_);
}
private:
void draw(sf::RenderTarget& target, sf::RenderStates states) const {
target.draw(cartSprite, states);
return;
}
static sf::Texture cartTexture;
static const std::string textureLoc;
sf::Sprite cartSprite;
};
const std::string Cart::textureLoc = "cart-empty.png";
int main() {
Cart testCart(sf::Vector2f(), sf::Color(200,200,200), 0);
return 0;
}
【问题讨论】:
-
From documentation: "如果您将 SFML 安装到非标准路径,您需要告诉链接器在哪里可以找到 SFML 库(.so 文件):" i> 所以也许添加
-L<sfml-install-path>/lib -
不,它在正确的位置——我已经使用这组链接器选项有效地编译了其他程序。此外,如果
sf::Vector2fs 和sf::Colors 以某种方式工作正常,但sf::Texture不起作用,当库路径混乱时,这会有点奇怪。我相信这个问题与变量的初始化有关。 -
哦,是
static。您需要像textureLoc那样初始化它。在Cart::textureLoc初始化后添加sf::Texture Cart::cartTexture;
标签: c++ g++ initialization sfml static-members