Autor Wątek: SMFL nie wiem jak pozbyć się tego błedu  (Przeczytany 1055 razy)

Offline Nornik

  • Użytkownik

# Luty 13, 2017, 19:34:38
Witam !
Podczas linkowanie przykładowego pliku jest taki błąd:
ContextSettings' is not a member of 'sf' a składnia wyrażenia wygląda tak:
sf :: ContextSettings contextSettings;. Nie sądzę aby to była wina konfiguracji bo inne przykłady kompilują się i linkują prawidłowo na tej samej konfiguracji C::B. Chodzi że nie rozpoznaje tego sf.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Lerhes

  • Użytkownik

# Luty 13, 2017, 20:16:56
Cześć,

Daj linka do tego przykładu i powiedz na której konkretnie linijce się wysypuje to pomożemy.

Żeby post miał jakąś wartość dodatnią (edukacyjną): błąd który podałeś występuje na etapie kompilacji, nie linkowania.

Pozdrawiam,
Lerhes

Offline Nornik

  • Użytkownik

# Luty 13, 2017, 20:51:09
No i nie wiem doszedł ten kod czy nie w załączniku nie chce przyjąć.

Offline Nornik

  • Użytkownik

# Luty 13, 2017, 20:52:06
////////////////////////////////////////////////////////////
// Headers
////////////////////////////////////////////////////////////
#include <SFML/Graphics>
#include <SFML/OpenGL.hpp>

#ifndef GL_SRGB8_ALPHA8
#define GL_SRGB8_ALPHA8 0x8C43
#endif


////////////////////////////////////////////////////////////
/// Entry point of application
///
/// \return Application exit code
///
////////////////////////////////////////////////////////////
int main()
{
    bool exit = false;
    bool sRgb = false;

   while (!exit)
    {
        // Request a 24-bits depth buffer when creating the window
        sf :: ContextSettings contextSettings;
        contextSettings.depthBits = 24;
        contextSettings.sRgbCapable = sRgb;

        // Create the main window
        sf::RenderWindow window(sf::VideoMode(800, 600), "SFML graphics with OpenGL", sf::Style::Default, contextSettings);
        window.setVerticalSyncEnabled(true);

        // Create a sprite for the background
        sf::Texture backgroundTexture;
        backgroundTexture.setSrgb(sRgb);
        if (!backgroundTexture.loadFromFile("resources/background.jpg"))
            return EXIT_FAILURE;
        sf::Sprite background(backgroundTexture);

        // Create some text to draw on top of our OpenGL object
        sf::Font font;
        if (!font.loadFromFile("resources/sansation.ttf"))
            return EXIT_FAILURE;
        sf::Text text("SFML / OpenGL demo", font);
        sf::Text sRgbInstructions("Press space to toggle sRGB conversion", font);
        sf::Text mipmapInstructions("Press return to toggle mipmapping", font);
        text.setFillColor(sf::Color(255, 255, 255, 170));
        sRgbInstructions.setFillColor(sf::Color(255, 255, 255, 170));
        mipmapInstructions.setFillColor(sf::Color(255, 255, 255, 170));
        text.setPosition(250.f, 450.f);
        sRgbInstructions.setPosition(150.f, 500.f);
        mipmapInstructions.setPosition(180.f, 550.f);

        // Load a texture to apply to our 3D cube
        sf::Texture texture;
        if (!texture.loadFromFile("resources/texture.jpg"))
            return EXIT_FAILURE;

        // Attempt to generate a mipmap for our cube texture
        // We don't check the return value here since
        // mipmapping is purely optional in this example
        texture.generateMipmap();

        // Enable Z-buffer read and write
        glEnable(GL_DEPTH_TEST);
        glDepthMask(GL_TRUE);
        glClearDepth(1.f);

        // Disable lighting
        glDisable(GL_LIGHTING);

        // Configure the viewport (the same size as the window)
        glViewport(0, 0, window.getSize().x, window.getSize().y);

        // Setup a perspective projection
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        GLfloat ratio = static_cast<float>(window.getSize().x) / window.getSize().y;
        glFrustum(-ratio, ratio, -1.f, 1.f, 1.f, 500.f);

        // Bind the texture
        glEnable(GL_TEXTURE_2D);
        sf::Texture::bind(&texture);

        // Define a 3D cube (6 faces made of 2 triangles composed by 3 vertices)
        static const GLfloat cube[] =
        {
            // positions    // texture coordinates
            -20, -20, -20,  0, 0,
            -20,  20, -20,  1, 0,
            -20, -20,  20,  0, 1,
            -20, -20,  20,  0, 1,
            -20,  20, -20,  1, 0,
            -20,  20,  20,  1, 1,

             20, -20, -20,  0, 0,
             20,  20, -20,  1, 0,
             20, -20,  20,  0, 1,
             20, -20,  20,  0, 1,
             20,  20, -20,  1, 0,
             20,  20,  20,  1, 1,

            -20, -20, -20,  0, 0,
             20, -20, -20,  1, 0,
            -20, -20,  20,  0, 1,
            -20, -20,  20,  0, 1,
             20, -20, -20,  1, 0,
             20, -20,  20,  1, 1,

            -20,  20, -20,  0, 0,
             20,  20, -20,  1, 0,
            -20,  20,  20,  0, 1,
            -20,  20,  20,  0, 1,
             20,  20, -20,  1, 0,
             20,  20,  20,  1, 1,

            -20, -20, -20,  0, 0,
             20, -20, -20,  1, 0,
            -20,  20, -20,  0, 1,
            -20,  20, -20,  0, 1,
             20, -20, -20,  1, 0,
             20,  20, -20,  1, 1,

            -20, -20,  20,  0, 0,
             20, -20,  20,  1, 0,
            -20,  20,  20,  0, 1,
            -20,  20,  20,  0, 1,
             20, -20,  20,  1, 0,
             20,  20,  20,  1, 1
        };

        // Enable position and texture coordinates vertex components
        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
        glVertexPointer(3, GL_FLOAT, 5 * sizeof(GLfloat), cube);
        glTexCoordPointer(2, GL_FLOAT, 5 * sizeof(GLfloat), cube + 3);

        // Disable normal and color vertex components
        glDisableClientState(GL_NORMAL_ARRAY);
        glDisableClientState(GL_COLOR_ARRAY);

        // Create a clock for measuring the time elapsed
        sf::Clock clock;

        // Flag to track whether mipmapping is currently enabled
        bool mipmapEnabled = true;

        // Start game loop
        while (window.isOpen())
        {
            // Process events
            sf::Event event;
            while (window.pollEvent(event))
            {
                // Close window: exit
                if (event.type == sf::Event::Closed)
                {
                    exit = true;
                    window.close();
                }

                // Escape key: exit
                if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape))
                {
                    exit = true;
                    window.close();
                }

                // Return key: toggle mipmapping
                if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Return))
                {
                    if (mipmapEnabled)
                    {
                        // We simply reload the texture to disable mipmapping
                        if (!texture.loadFromFile("resources/texture.jpg"))
                            return EXIT_FAILURE;

                        mipmapEnabled = false;
                    }
                    else
                    {
                        texture.generateMipmap();

                        mipmapEnabled = true;
                    }
                }

                // Space key: toggle sRGB conversion
                if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Space))
                {
                    sRgb = !sRgb;
                    window.close();
                }

                // Adjust the viewport when the window is resized
                if (event.type == sf::Event::Resized)
                    glViewport(0, 0, event.size.width, event.size.height);
            }

            // Draw the background
            window.pushGLStates();
            window.draw(background);
            window.popGLStates();

            // Clear the depth buffer
            glClear(GL_DEPTH_BUFFER_BIT);

            // We get the position of the mouse cursor, so that we can move the box accordingly
            float x =  sf::Mouse::getPosition(window).x * 200.f / window.getSize().x - 100.f;
            float y = -sf::Mouse::getPosition(window).y * 200.f / window.getSize().y + 100.f;

            // Apply some transformations
            glMatrixMode(GL_MODELVIEW);
            glLoadIdentity();
            glTranslatef(x, y, -100.f);
            glRotatef(clock.getElapsedTime().asSeconds() * 50.f, 1.f, 0.f, 0.f);
            glRotatef(clock.getElapsedTime().asSeconds() * 30.f, 0.f, 1.f, 0.f);
            glRotatef(clock.getElapsedTime().asSeconds() * 90.f, 0.f, 0.f, 1.f);

            // Draw the cube
            glDrawArrays(GL_TRIANGLES, 0, 36);

            // Draw some text on top of our OpenGL object
            window.pushGLStates();
            window.draw(text);
            window.draw(sRgbInstructions);
            window.draw(mipmapInstructions);
            window.popGLStates();

            // Finally, display the rendered frame on screen
            window.display();
        }
    }

    return EXIT_SUCCESS;
}

Offline Lerhes

  • Użytkownik

# Luty 13, 2017, 21:57:06
Nie chce mi się ustawiać SMFL, żeby potwierdzić gdzie i dlaczego jest problem. Dlatego trochę zgadując, spróbuj dodać na początek pliku:
#include <ContextSettings.hpp>
I daj znać co z tego wyszło.

Pozdrawiam,
Lerhes

Offline Gabes

  • Użytkownik
    • Allegro5kurs

# Luty 13, 2017, 22:03:33
Usuń poprzednie wersje SFML i Code::Blocks.
Pobierz :
SFML2  GCC 4.9.2 TDM (SJLJ) - 32-bit http://www.sfml-dev.org/download/sfml/2.4.2/
codeblocks-16.01mingw-setup.exe (79.9MB)   Sourceforge.net lub FossHub

twój wpis?
http://cpp0x.pl/forum/temat/?id=24635

i musi działać:)

Offline Nornik

  • Użytkownik

# Luty 13, 2017, 22:22:32
Dziękuję, pobrałem tą wersję, okazało się, że mam mam ją już na dysku. CB nie usuwam bo dzisiaj go instalowałem, wersja 16.01. Czyli tylko dopiszę plik nagłówkowy. Tak pomyślałem, brakuje jakiegoś pliku .hpp, tylko nie wiedziałem którego. Jutro odpiszę jak sprawdzę. Dzisiaj już mam dość. Pozdrawiam i dziękuję.

Offline Gabes

  • Użytkownik
    • Allegro5kurs

# Luty 13, 2017, 22:38:00
problem z dodawaniem załączników, dodaje z zewnątrz
https://dysk.onet.pl/link/QKm1v#
skorzystaj z  projektu OpenGL.cbp (code blocks proj.)


Offline Nornik

  • Użytkownik

# Luty 13, 2017, 23:45:05
Bardzo, bardzo dziękuję. Naprowadziłeś mnie na właściwy tok rozumowania. Poza tym okazuje się, że ważne są wersje bibliotek, jak się okazuje to każdy - no może prawie prawie każdy - przykład wymaga innej wersji biblioteki. Teraz jestem na właściwym kierunku. Dziękuję.

Offline Nornik

  • Użytkownik

# Luty 14, 2017, 11:44:33
Dzisiaj wszystko sprawdziłem, "gra i buczy". Jest tylko jeden aspekt tej instalacji, którego nie rozumiem. W opcji "Debug bez literki d, s-d" jest taki wpis dla linkera "libsfml-graphics.a" a dalej już sfml-window-d" i.t.d. Taki wpis "libsfml-graphics.a" występuje tylko w tym jednym przypadku - dlaczego - przecież w katalogu lib SFML-2.42 inne też mają rozszerzenie.a, jednak do pozostałych używasz tylko sfml-***.

Offline Gabes

  • Użytkownik
    • Allegro5kurs

# Luty 14, 2017, 14:31:15
Witam, moje niedopatrzenie.
Można stosować pełną nazwę lub skróconą po odcięciu przedrostka(-lib) i przyrostka (.a)
tak można
libsfml-graphics-d.a
sfml-graphics-d
libsfml-graphics-d
zostanie to zinterpretowane: -lsfml-graphics-d , zobacz w build log.

Tak nie można:
sfml-graphics-d.a (hyba że miałbyś liba o takiej nazwie bez lib na początku)

Wielkość liter w skróconej nazwie i pełnej może być dowolna(bez przedrostka i przyrostka):
libsFmL-GraPHicS-D.a
SFML-GraphICs-d
libsFML-Graphics-D
GDI32, libGDI32, libgdi32.a, libGdi32...itd

tak nie:
LIBsfml-graphics-d.A, Gdi32.a


Zapewne zauważyłeś że pliki *.exe mają różne nazwy i pojawiają się  obok OpenGL.cbp i folderu \resources
zostało to ustawione w:

Project->Properties...->Build targets
Jak widać można dodać nowy obiekt, zmienić nazwę, zduplikować czy usunąć.
W Output filename: zmieniamy nazwę i ścieżkę jak i folder, foldery gdzie ma się pojawić plik wykonywalny *.exe
np.bin\Debug\OpenGL_d.exe

A w Type: czy ma to być proj. konsolowy, Gui app.,kompilacja własnych bibliotek statycznych (np. libAla_ma-kota.a, dynamicznych gdzie jej zawartość jest przechowywana w bibliotekach współdzielonych (*.dll), można pobrać pliki źródłowe biblioteki np. SFML i samemu skompilowć, potrzebny będzie jeszcze program 'CMake'

Mogłem również podać różne nazwy folderów dla każdego trybu kompilacji w Objects output dir: dla Debug_s (obj\Debug_s\
gdy mamy projekt wieloplikowy i nie chcemy marnować czasu na ponowną kompilacje wszystkiego a dokonaliśmy zmian tylko w jednym, zostanie skompilowany tylko ten (kółeczko Build).

Offline Nornik

  • Użytkownik

# Luty 14, 2017, 16:54:23
Serdecznie Ci dziękują za tak precyzyjną odpowiedź, gdyby wszyscy na forach posiadali taką wiedzę i tak rzeczowo i skrupulatnie odpowiadali nauka szła by dużo łatwiej. Do paru opcji już doszedłem m.in. Project->Properties...->Build targets. Jeszcze muszę wyrobić sobie nawyk sprawdzania pliku build.log to bardzo rozjaśnia sprawę błędnego wykonania kompilacji i linkowania. No cóż teraz będę studiował pliki przykładowe wraz z poradnikami. Trochę pojęcia mam co dotyczy C,(głównie Linux) C++, ale jest jeszcze dużo do nauki np.
klasy, konstruktory wskaźniki , określenie adresu (&) w tych kwestiach jeszcze muszę sporo się nauczyć. Serdecznie pozdrawiam i dziękuję.