program się nie kompiluje i nie pokazuje informacji o błędach

0

Próbuję napisać własną nakładkę na OpenGL podobną do SFML, niestety po skompilowaniu biblioteki i dołączeniu jej do projektu dostaje losowy błąd:

error:ld returned 1 exit status 

i tyle... nic więcej się nie pojawia jedynie ta informacja. Czy ktoś może powiedzieć w jakich sytuacjach pojawia się dany błąd? wolałbym nie wklejać kodu, bo jest go dosyć dużo(1430) w paru plikach

1

To błąd linkera. To oznacza że w kodzie includujesz jakieś nagłówki bibliotek ale nie linkujesz podczas kompilacji samych bibliotek.

0

hmn... ciekawe... z tych które trzeba linkować to chyba tylko freetype dodałem
ale dałem flagę linkera freetype
EDIT:
dodaję jeszcze glew.h i flagi opengl32 glu32

0

w projekcie biblioteki mam 3 cele kompilacji:
Release(kompiluje wszystkie pliki)
Graphics(kompiluje tylko pliki związane z grafiką)
System(kompiluje tylko pliki z dodatkowymi funkcjami)

w programie błąd występuje po dołączeniu pliku .a od Release oraz po dołączeniu plików z Graphics i System zamiast z Release

0

Nie wiem czy to coś zmieni ale to są wszystkie pliki nagłówkowe jakie są dołączane gdziekolwiek( gdy jest dołączany przez "" to znaczy, że to mój plik)

#include "frame.h"
#include <vector>
#include <cmath>
#include <string> 
#ifndef FFGE_GRAPHICS
#include <GL/glew.h>
#endif // FFGE_GRAPHICS
#include "system.h"
#include "basics.h"
#include "text.h"
#include "scene.h"
#include "object.h"
#include "formatting.h"
#include <fstream>
#include <cstdlib>
#include <SOIL.h>
#include "graphics.h"
#include <ft2build.h>
#include FT_FREETYPE_H

z tego co wiem to tylko glew i freetype z powyżej wymienionych potrzebują linkowania...(nie liczę moich plików)

0

nie no bez przesady musisz mieć jakiś sensowny opis błędu.
Przy błędzie linkera powinno być coś w stylu: undefined reference to symbol '<jakiś symbol>'.
Może przekierowałeś standardowe strumienie danych i przez to pominęło standardowy strumień błędów.

0

http://prntscr.com/bxx6lf
nie, nie ma żadnego kodu błędu i nic nie przekierowywałem(nawet nie wiem o co chodzi) stworzyłem tylko nowy projekt sfml, wywaliłem wyświetlanie, dodałem minimalny działający kod i moją bibliotekę

0

Dziękuję za pomoc, zlokalizowałem błąd ale nie wiem jak go naprawić. Mam klasę która przygotowuje freetype i ma zabezpieczenie by był przygotowany tylko raz:

#Text.h#
struct _FreeTypeInitializer
    {
        static bool initialized;
        static FT_Library freetype;
        static _FreeTypeInitializer Guard;
        _FreeTypeInitializer();
    };
    bool _FreeTypeInitializer::initialized=false;
    _FreeTypeInitializer _FreeTypeInitializer::Guard;
    FT_Library _FreeTypeInitializer::freetype; 
#Text.cpp#
_FreeTypeInitializer::_FreeTypeInitializer()
    {
        if (!initialized)
            if(!FT_Init_FreeType(&freetype))
                initialized=true;
    }

ten kod powoduje błędy kompilacji, kiedyś z nim walczyłem ale nie pamiętam jak go zlikwidować

0

zapomniałem, że muszę inicjalizować statyczne zmienne składowe w pliku .cpp , to chyba to powoduje błąd
@carlosmay możesz napisać w poście to, co napisałeś w komentarzu? Inaczej nie mogę dać łapki i zatwierdzić

0

Jednak nie pamiętam jak to naprawić :( jaki jest najlepszy sposób na inicjalizację freetype? muszę stworzyć zmienną i podać ją jako argument funkcji ale nie chcę żeby trzeba było wywoływać tą funkcję w int main

1

Podaj dokładnie to co jest w Build log.

Jeśli chodzi o:

#Text.h#
struct _FreeTypeInitializer
    {
        static bool initialized;
        static FT_Library freetype;
        static _FreeTypeInitializer Guard;
        _FreeTypeInitializer();
    };
    bool _FreeTypeInitializer::initialized=false;
    _FreeTypeInitializer _FreeTypeInitializer::Guard;
    FT_Library _FreeTypeInitializer::freetype; 
#Text.cpp#
_FreeTypeInitializer::_FreeTypeInitializer()
    {
        if (!initialized)
            if(!FT_Init_FreeType(&freetype))
                initialized=true;
    }

To powinno być tak:

#Text.h#
struct _FreeTypeInitializer
    {
        static bool initialized;
        static FT_Library freetype;
        static _FreeTypeInitializer Guard;
        _FreeTypeInitializer();
    };
#Text.cpp#
bool _FreeTypeInitializer::initialized=false;
_FreeTypeInitializer _FreeTypeInitializer::Guard;
FT_Library _FreeTypeInitializer::freetype; 
_FreeTypeInitializer::_FreeTypeInitializer()
    {
        if (!initialized)
            if(!FT_Init_FreeType(&freetype))
                initialized=true;
    }
1

Powinno być tak:
Text.h

struct _FreeTypeInitializer
    {
        static bool initialized;
        static FT_Library freetype;
        static _FreeTypeInitializer Guard;
        _FreeTypeInitializer();
    };

Text.cpp

bool  _FreeTypeInitializer::initialized=false;
_FreeTypeInitializer  _FreeTypeInitializer::Guard;
FT_Library  _FreeTypeInitializer::freetype; 

_FreeTypeInitializer::_FreeTypeInitializer()
    {
        if (!initialized)
            if(!FT_Init_FreeType(&freetype))
                initialized=true;
    }

Definicja zmiennych statycznych musi być w CPP!

0

niestety po poprawieniu kodu i przeniesieniu definicji zmiennych statycznych mam nadal takie same błędy:

K:/C++/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/4.9.2/../../../libswml-all.a(text.o):text.cpp:(.bss+0x5): multiple definition of `FFGE::_FreeTypeInitializer::initialized'
obj\Release\main.o:main.cpp:(.bss+0xd): first defined here
K:/C++/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/4.9.2/../../../libswml-all.a(text.o):text.cpp:(.bss+0x4): multiple definition of `FFGE::_FreeTypeInitializer::Guard'
obj\Release\main.o:main.cpp:(.bss+0xc): first defined here
K:/C++/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/4.9.2/../../../../mingw32/bin/ld.exe: obj\Release\main.o: bad reloc address 0xe in section `.text$_ZN4FFGE7GLSceneD1Ev[__ZN4FFGE7GLSceneD1Ev]'
collect2.exe: error: ld returned 1 exit status
 
0

Linker mówi że masz definicje tej zmiennej zarówno w text.cpp jak i w main.cpp, zdecyduj sie...

0

W main.cpp nie mam definicji... mam ją tylko w text.cpp,

#include <SFML/Window.hpp>

#include<swml/swml.h>

using namespace sf;
using namespace FFGE;
int main()
{
    GLRect winrect(0,0,800,450);
    Window window(VideoMode(winrect.width,winrect.height), "SFML window");
    GLScene main_scene;
    main_scene.view=GLView(winrect,winrect);
    GLText::GLFont font;
    font.loadFromFile("arial.ttf");
    GLText text;
    text.setFont(font);
    text.message="it is working... interesting";
    text.position.x=200;
    text.position.y=200;
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(90,16/9.0,1,500);
    glEnable(GL_BLEND);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glEnable(GL_ALPHA_TEST);
    glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
    bool running=true;
    while (running)
    {
        Event event;
        while (window.pollEvent(event))
        {
            switch (event.type)
            {
            case Event::Closed:
                {
                    running=false;
                    break;
                }
            default:
                break;
            }
        }
        glClearColor(0.0f, 0.0f, 0.0f,0.0f);
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glTranslated(0,0,-1);
        main_scene(winrect);
        window.display();
    }
    return EXIT_SUCCESS;
}
 
0

hmn... dziwne, parę razy przebudowałem bibliotekę dając definicje raz do .h a raz do .cpp i działa... nie za bardzo rozumiem dlaczego ale działa, dziękuję za pomoc

1 użytkowników online, w tym zalogowanych: 0, gości: 1