代码之家  ›  专栏  ›  技术社区  ›  dalvol.amsi

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

  •  1
  • dalvol.amsi  · 技术社区  · 3 周前

    我正在尝试编译一个*.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++(Rev.3,由MSYS2项目构建)13.2.0; SFML-3.0。 我向ChatGpt询问的命令提示符文本行。 我复制的代码是从一个带有指南的网站上粘贴的: https://habr.com/ru/articles/703500/ 。其他人成功地使用了这段代码,但我没有。请帮帮我,我已经解决这个问题好几天了(想退出编程…)

    1 回复  |  直到 3 周前
        1
  •  4
  •   Ted Lyngmo    3 周前

    由于您正在使用 SFML3 ,你需要做一些改变。以前有分别获取高度和宽度的重载的大多数函数现在都有一个构造函数或成员函数 sf::Vector2u , sf::Vector2f 或类似,如 void CircleShape::setPosition (Vector2f position)

    还有一个 Migration to SFML3 guide 。请进 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);
        // getGeometricCenter() is new in SFML3. 
        // Set origin in the middle of the shape:
        shape.setOrigin(shape.getGeometricCenter());
        shape.setPosition({200, 200});               // center of window
        //                ^        ^
        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(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
        }
    }