无法在 Windows 上使用 g++ 编译带有 SFML 的 *.cpp 文件

问题描述 投票:0回答:1

我正在尝试编译 *.cpp 文件:

#include <SFML/Graphics.hpp>

using namespace sf;

int main()
{
    
    RenderWindow window(VideoMode(400, 400), L"New project", Style::Default);
    
    window.setVerticalSyncEnabled(true);
       
    CircleShape shape(100.f,3); 
    shape.setPosition(100, 100);           
    shape.setFillColor(Color::Magenta);
        
    while (window.isOpen())
    {
        Event event;
        while (window.pollEvent(event))
        {
            if (event.type == Event::Closed)
                window.close();
        }
        
        window.clear(Color::Blue);
        window.draw(shape);
        window.display();
    }
    return 0;
}

我将

g++ Durak.cpp -o output.exe -I"C:\Users\dalvo\IT\SFML (MinGW)\SFML-3.0.0\include" -L"C:\Users\dalvo\IT\SFML (MinGW)\SFML-3.0.0\lib" -lsfml-graphics -lsfml-window -lsfml-system
放入控制台,但出现错误:

main.cpp: In function 'int main()':
main.cpp:8:43: error: no matching function for call to 'sf::VideoMode::VideoMode(int, int)'
    8 |     RenderWindow window(VideoMode(400, 400), L"New project", Style::Default);
      |                                           ^
In file included from C:\Users\dalvo\IT\SFML (MinGW)\SFML-3.0.0\include/SFML/Graphics/RenderWindow.hpp:35,
                 from C:\Users\dalvo\IT\SFML (MinGW)\SFML-3.0.0\include/SFML/Graphics.hpp:45,
                 from main.cpp:1:
C:\Users\dalvo\IT\SFML (MinGW)\SFML-3.0.0\include/SFML/Window/VideoMode.hpp:61:14: note: candidate: 'sf::VideoMode::VideoMode(sf::Vector2u, unsigned int)'
   61 |     explicit VideoMode(Vector2u modeSize, unsigned int modeBitsPerPixel = 32);
      |              ^~~~~~~~~
C:\Users\dalvo\IT\SFML (MinGW)\SFML-3.0.0\include/SFML/Window/VideoMode.hpp:61:33: note:   no known conversion for argument 1 from 'int' to 'sf::Vector2u' {aka 'sf::Vector2<unsigned int>'}
   61 |     explicit VideoMode(Vector2u modeSize, unsigned int modeBitsPerPixel = 32);
      |                        ~~~~~~~~~^~~~~~~~
C:\Users\dalvo\IT\SFML (MinGW)\SFML-3.0.0\include/SFML/Window/VideoMode.hpp:52:5: note: candidate: 'constexpr sf::VideoMode::VideoMode()'
   52 |     VideoMode() = default;
      |     ^~~~~~~~~
C:\Users\dalvo\IT\SFML (MinGW)\SFML-3.0.0\include/SFML/Window/VideoMode.hpp:52:5: note:   candidate expects 0 arguments, 2 provided
C:\Users\dalvo\IT\SFML (MinGW)\SFML-3.0.0\include/SFML/Window/VideoMode.hpp:43:23: note: candidate: 'constexpr sf::VideoMode::VideoMode(const sf::VideoMode&)'
   43 | class SFML_WINDOW_API VideoMode
      |                       ^~~~~~~~~
C:\Users\dalvo\IT\SFML (MinGW)\SFML-3.0.0\include/SFML/Window/VideoMode.hpp:43:23: note:   candidate expects 1 argument, 2 provided
C:\Users\dalvo\IT\SFML (MinGW)\SFML-3.0.0\include/SFML/Window/VideoMode.hpp:43:23: note: candidate: 'constexpr sf::VideoMode::VideoMode(sf::VideoMode&&)'
C:\Users\dalvo\IT\SFML (MinGW)\SFML-3.0.0\include/SFML/Window/VideoMode.hpp:43:23: note:   candidate expects 1 argument, 2 provided
main.cpp:13:22: error: no matching function for call to 'sf::CircleShape::setPosition(int, int)'
   13 |     shape.setPosition(100, 100);
      |     ~~~~~~~~~~~~~~~~~^~~~~~~~~~
In file included from C:\Users\dalvo\IT\SFML (MinGW)\SFML-3.0.0\include/SFML/Graphics/Shape.hpp:37,
                 from C:\Users\dalvo\IT\SFML (MinGW)\SFML-3.0.0\include/SFML/Graphics/CircleShape.hpp:32,
                 from C:\Users\dalvo\IT\SFML (MinGW)\SFML-3.0.0\include/SFML/Graphics.hpp:32:
C:\Users\dalvo\IT\SFML (MinGW)\SFML-3.0.0\include/SFML/Graphics/Transformable.hpp:70:10: note: candidate: 'void sf::Transformable::setPosition(sf::Vector2f)'
   70 |     void setPosition(Vector2f position);
      |          ^~~~~~~~~~~
C:\Users\dalvo\IT\SFML (MinGW)\SFML-3.0.0\include/SFML/Graphics/Transformable.hpp:70:10: note:   candidate expects 1 argument, 2 provided
main.cpp:18:15: error: no matching function for call to 'sf::Event::Event()'
   18 |         Event event;
      |               ^~~~~
In file included from C:\Users\dalvo\IT\SFML (MinGW)\SFML-3.0.0\include/SFML/Window/WindowBase.inl:28,
                 from C:\Users\dalvo\IT\SFML (MinGW)\SFML-3.0.0\include/SFML/Window/WindowBase.hpp:617,
                 from C:\Users\dalvo\IT\SFML (MinGW)\SFML-3.0.0\include/SFML/Window/Window.hpp:32,
                 from C:\Users\dalvo\IT\SFML (MinGW)\SFML-3.0.0\include/SFML/Graphics/RenderWindow.hpp:36:
C:\Users\dalvo\IT\SFML (MinGW)\SFML-3.0.0\include/SFML/Window/Event.hpp:306:5: note: candidate: 'template<class TEventSubtype> sf::Event::Event(const TEventSubtype&)'
  306 |     Event(const TEventSubtype& eventSubtype);
      |     ^~~~~
C:\Users\dalvo\IT\SFML (MinGW)\SFML-3.0.0\include/SFML/Window/Event.hpp:306:5: note:   template argument deduction/substitution failed:
main.cpp:18:15: note:   candidate expects 1 argument, 0 provided
   18 |         Event event;
      |               ^~~~~
C:\Users\dalvo\IT\SFML (MinGW)\SFML-3.0.0\include/SFML/Window/Event.hpp:46:7: note: candidate: 'constexpr sf::Event::Event(const sf::Event&)'
   46 | class Event
      |       ^~~~~
C:\Users\dalvo\IT\SFML (MinGW)\SFML-3.0.0\include/SFML/Window/Event.hpp:46:7: note:   candidate expects 1 argument, 0 provided
C:\Users\dalvo\IT\SFML (MinGW)\SFML-3.0.0\include/SFML/Window/Event.hpp:46:7: note: candidate: 'constexpr sf::Event::Event(sf::Event&&)'
C:\Users\dalvo\IT\SFML (MinGW)\SFML-3.0.0\include/SFML/Window/Event.hpp:46:7: note:   candidate expects 1 argument, 0 provided
main.cpp:19:32: error: no matching function for call to 'sf::RenderWindow::pollEvent(sf::Event&)'
   19 |         while (window.pollEvent(event))
      |                ~~~~~~~~~~~~~~~~^~~~~~~
C:\Users\dalvo\IT\SFML (MinGW)\SFML-3.0.0\include/SFML/Window/WindowBase.hpp:226:40: note: candidate: 'std::optional<sf::Event> sf::WindowBase::pollEvent()'
  226 |     [[nodiscard]] std::optional<Event> pollEvent();
      |                                        ^~~~~~~~~
C:\Users\dalvo\IT\SFML (MinGW)\SFML-3.0.0\include/SFML/Window/WindowBase.hpp:226:40: note:   candidate expects 0 arguments, 1 provided
main.cpp:21:23: error: 'class sf::Event' has no member named 'type'
   21 |             if (event.type == Event::Closed)
      |                       ^~~~
main.cpp:21:44: error: expected primary-expression before ')' token
   21 |             if (event.type == Event::Closed)
      |                                            ^

我的版本如下: g++(Rev3,由 MSYS2 项目构建)13.2.0; SFML-3.0.0。 我从 ChatGpt 询问的命令提示文本行。 我从带有指南的网站复制粘贴的代码:https://habr.com/ru/articles/703500/。其他人成功地使用了此代码,但我没有。请帮助我,我已经解决这个问题好几天了(已经想退出编程了......)

c++ windows cmd g++ sfml
1个回答
0
投票

由于您使用的是 SFML3,因此需要进行一些更改。大多数以前具有分别获取高度和宽度的重载的函数现在都具有采用

sf::Vector2u
或类似值的构造函数或成员函数。

还有一个迁移到 SFML3 指南。只需在搜索框中输入

VideoMode
,它就会告诉你如何在SFML3中正确拨打电话。

您的程序已解决问题:

#include <SFML/Graphics.hpp>

using namespace sf;

int main() {
    RenderWindow window(VideoMode({400, 400}), L"New project", Style::Default);
    //                            ^        ^

    window.setVerticalSyncEnabled(true);

    CircleShape shape(100.f, 3);
    shape.setOrigin(shape.getGeometricCenter()); // getGeometricCenter: new in SFML3
    shape.setPosition({200, 200});
    //                ^        ^
    shape.setFillColor(Color::Magenta);

    while(window.isOpen()) {
        while(auto event = window.pollEvent()) { // polling in SFML3
            if(event->is<sf::Event::Closed>()) {
                window.close();
            } else if(const auto* keyPressed =
                          event->getIf<sf::Event::KeyPressed>()) {
                if(keyPressed->scancode == sf::Keyboard::Scancode::Escape)
                    window.close();
            }
        }

        window.clear(Color::Blue);
        window.draw(shape);
        window.display();
        shape.rotate(degrees(1.0f)); // rotate takes an sf::Angle in SFML3
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.