SFML“未定义引用`sf :: Font :: loadFromFile()'”

时间:2017-03-20 11:09:32

标签: c++ sfml

我正在学习如何使用SFML,在完成RenderWindow教程后没有任何问题,我已经开始尝试将sf::Textsf::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中编写代码。

0 个答案:

没有答案