Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Dzielenie kodu na kilka plików źródłowych][Linux - terminal] Niewidoczne w main ciało załączanego pliku *.cpp.

Ostatnio zmodyfikowano 2013-09-03 22:34
Autor Wiadomość
Mieciu
Temat założony przez niniejszego użytkownika
[Dzielenie kodu na kilka plików źródłowych][Linux - terminal] Niewidoczne w main ciało załączanego pliku *.cpp.
» 2013-09-03 22:34:00
Witam.

Opis problemu:

Obecnie staram nauczyć się na Linuxie programowania z wykorzystaniem biblioteki SDL2.
Mam problem z rozbiciem kodu C++ na kilka plików. Wykorzystywany kod znajduje się w repozytorium GitHub dostępnym tutaj: https://github.com/Twinklebear​/TwinklebearDev-Lessons/tree​/master/Lesson7

Kompilacji dokonuję z poziomu terminala. Kompilator zwraca następujące informacje:
archy@lnx ~/Projekty/C++/SDL2 Tutorial % clang++ -Wall -g main.cpp -o tutorial1.o -std=c++11 -lSDL2 -lSDL2_image -lSDL2_ttf
tutorial1.cpp:22: error: undefined reference to 'Window::Init(std::string)'
tutorial1.cpp:26: error: undefined reference to 'Window::Quit()'
tutorial1.cpp:35: error: undefined reference to 'Window::LoadImage(std::string const&)'
tutorial1.cpp:40: error: undefined reference to 'Window::RenderText(std::string const&, std::string const&, SDL_Color, int)'
tutorial1.cpp:45: error: undefined reference to 'Window::Quit()'
tutorial1.cpp:49: error: undefined reference to 'Window::Box()'
tutorial1.cpp:50: error: undefined reference to 'Window::Box()'
tutorial1.cpp:84: error: undefined reference to 'Window::Clear()'
tutorial1.cpp:86: error: undefined reference to 'Window::Draw(SDL_Texture*, SDL_Rect&, SDL_Rect*, float, int, int, SDL_RendererFlip)'
tutorial1.cpp:87: error: undefined reference to 'Window::Draw(SDL_Texture*, SDL_Rect&, SDL_Rect*, float, int, int, SDL_RendererFlip)'
tutorial1.cpp:89: error: undefined reference to 'Window::Present()'
tutorial1.cpp:93: error: undefined reference to 'Window::Quit()'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Sytuacja wydaje się jasna - nie ma dostępu/nie jest widoczne ciało pliku window.cpp. Błąd ewidentnie tkwi też po mojej stronie, ponieważ po postawieniu Code::Blocks i należytym ustawieniu właściwości i własności projektu wszystko idzie gładko. Chciałem dociec co tak naprawdę robię źle, stworzyłem nowy projekt, gdzie spróbowałem swych sił w przykładzie z tej lekcji http://cpp0x.pl/kursy/Kurs-C++​/Dzielenie-kodu-na-kilka-plikow​-zrodlowych​/310. Efekt ten sam (za wyjątkiem innych zwracanych błędów - dotyczyły innych brakujących deklaracji).

Zacząłem szperać na forach w poszukiwaniu odpowiedzi, używając coraz to prostszego kodu (choćby tego, totalne podstawy, żadnej magii, minimum bibliotek w użyciu: http://cpp0x.pl/forum/temat/​?id=6100#/forum/temat/?id=6100​&p=2. Bez rezultatu.

Co do każdego z podanych przykładów - rozwiązanie w każdym przypadku było takie same - miast załączać plik nagłówkowy, po załączeniu pliku .cpp wszystko hulało. Jednak to podejście, o ile teraz wystarczające, w przyszłości może mnie zgubić, gdy zacznę tworzyć jakiś większy projekt w C++. Dodatkowo to marnowanie zasobów procesora na wielokrotną kompilację.

Programuję od kilku ładnych lat (dopiero teraz w C++), nie jestem też świeżakiem w używaniu Linuxa, po raz pierwszy jednak wykorzystuję go do kompilowania własnego kodu. Nie chcę korzystać z IDE (jestem w trakcie przesiadki z NetBeansa na Emacsa), więc takie rozwiązanie jest nieakceptowalne dla mnie.

Co do problemu - użycie GCC zamiast Clanga nie pomogło, podawanie absolutnych ścieżek, zamiast relatywnych też nie.



Co stanowi problem:

Proszę o wskazówki, co poczyniam źle i jak z tego wybrnąć. Wszystkie brakujące informacje, jakie mogą być potrzebne, oczywiście dodam, jeżeli tylko zajdzie taka potrzeba.



EDIT: Problem rozwiązany. Ciało pliku window.cpp nie było widoczne, gdyż nie było kompilowane. Aby je skompilować "za jednym zamachem" z plikiem tutorial1.cpp (i innymi plikami w przyszłości) należy podać w poleceniu wszystkie pliki, które mają być skompilowane. A więc zamiast używać:
clang++ -Wall -g main.cpp -o tutorial1.o -std=c++11 -lSDL2 -lSDL2_image -lSDL2_ttf

należy użyć:
clang++ -Wall -g main.cpp window.cpp -o tutorial1.o -std=c++11 -lSDL2 -lSDL2_image -lSDL2_ttf


Jeżeli plików jest dużo, wygodniej jest posłużyć się plikiem makefile. Co do jego budowy odsyłam do wielu kursów dostępnych w internecie ;)
P-91509
« 1 »
  Strona 1 z 1