我正在学习如何使用SFML,在完成RenderWindow教程后没有任何问题,我已经开始尝试将sf::Text
和sf::Font
用于页面上的下一个教程。
这是我的代码:
#include <iostream>
#include <SFML/Graphics.hpp>
#include <SFML/Graphics/Font.hpp>
#include <SFML/Graphics/Text.hpp>
int main() {
// initialise font
sf::Font ubuntu_r;
if(!ubuntu_r.loadFromFile("Ubuntu-R.ttf")) {
// unable to load font
std::cout << "Cannot load font." << std::endl;
}
// initialise text
sf::Text text;
text.setFont(ubuntu_r);
text.setString("Hello, world!");
text.setCharacterSize(50);
text.setColor(sf::Color(0x555555ff));
// initialise window
sf::RenderWindow win(sf::VideoMode(800,600),"Hello, world!");
// main loop
while(win.isOpen()) {
// check for closure
sf::Event e;
while(win.pollEvent(e)) {
if(e.type == sf::Event::Closed) {
win.close();
}
}
// draw text to screen
win.clear(sf::Color::White);
win.draw(text);
win.display();
}
return 0;
}
在编译时产生以下结果:
$ g++ -c text.cpp
$ g++ text.o -o text -lsfml-graphics -lsfml-system -lsfml-window
text.o: In function `main':
text.cpp:(.text+0x10d): undefined reference to `sf::Font::loadFromFile(std::string const&)'
collect2: error: ld returned 1 exit status
这非常令人困惑,因为我已在Font.hpp
办理登机手续,而loadFromFile()
肯定已定义。
注释掉所有文本和字体相关的代码会产生一个完美编译的程序,该程序会创建一个正常关闭的白色窗口。
然而,最奇怪的是,如果我有选择地只评论loadFromFile()
位:
#include <iostream>
#include <SFML/Graphics.hpp>
#include <SFML/Graphics/Font.hpp>
#include <SFML/Graphics/Text.hpp>
int main() {
// initialise font
sf::Font ubuntu_r;
/*
if(!ubuntu_r.loadFromFile("Ubuntu-R.ttf")) {
// unable to load font
std::cout << "Cannot load font." << std::endl;
}
*/
// initialise text
sf::Text text;
text.setFont(ubuntu_r);
text.setString("Hello, world!");
text.setCharacterSize(50);
text.setColor(sf::Color(0x555555ff));
// initialise window
sf::RenderWindow win(sf::VideoMode(800,600),"Hello, world!");
// main loop
while(win.isOpen()) {
// check for closure
sf::Event e;
while(win.pollEvent(e)) {
if(e.type == sf::Event::Closed) {
win.close();
}
}
// draw text to screen
win.clear(sf::Color::White);
//win.draw(text);
win.display();
}
return 0;
}
这个程序编译,像以前一样用白色屏幕运行,但在关闭时给出一个段错误!
$ g++ -c text.cpp
$ g++ text.o -o text -lsfml-window -lsfml-system -lsfml-graphics
$ ./text
(我点击窗口关闭)
Segmentation fault (core dumped)
到底是怎么回事?显然sf::Font
不是问题,因为它编译并且运行正常,除loadFromFile()
之外的所有内容。
我不确定段错误,因为在this post上问题似乎与我自己的问题略有不同(例如,每个时间都不会发生)。我最初的想法是,segfault是由尝试使用未定义字体绘制的程序引起的,但是一旦程序启动,不应该导致运行时错误,而不仅仅是在关闭窗口时?
此外,this可能与此问题有关吗?我的错误消息看起来很不一样。
我正在使用Ubuntu 16.04,在终端中使用gcc进行编译并在jEdit中编写代码。