• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Co robię źle?

+1 głos
118 wizyt
pytanie zadane 6 stycznia w C i C++ przez jegor377 Stary wyjadacz (12,730 p.)

Cześć, próbuję skompilować mój program w konsoli ale linker wywala mi błędy. Szukam już godzinami jak to naprawić i nic. Wszystkie moje pliki mieszczą się w jednym folderze. Tutaj kod:

main.cpp

#include <iostream>
#define _USE_MATH_DEFINES
#define _WIN32_WINNT 0x0500
#include <cmath>
#include <windows.h>
#include "GraphicsFramework.hpp"

using namespace std;

int main() {
	HWND console = GetConsoleWindow();
	HDC hdc = GetDC( console );
	
	GraphicsFramework gf(hdc);
	gf.SetPen(CreatePen(PS_SOLID, 5, RGB(255, 255, 255)));

	int angle = 45;
	int len = 50;
	while(1) {
		Vector startPos = {
			50,
			50
		};
		Vector endPos = {
			startPos.x + (int)(sin(angle * M_PI / 180) * len),
			startPos.y - (int)(cos(angle * M_PI / 180) * len)
		};
		gf.DrawLine(startPos, endPos);
	}
	ReleaseDC(console, hdc);
	return 0;
}

GraphicsFramework.hpp

#ifndef GRAPHICS_FRAMEWORK_H
#define GRAPHICS_FRAMEWORK_H

#include <windows.h>
#define _WIN32_WINNT 0x0500

#include "Vector.hpp"

class GraphicsFramework {
	HDC hdc;
	HPEN pen;

public:

	GraphicsFramework(HDC hdc);
	~GraphicsFramework();

	void SetPen(HPEN pen);
	void DestroyPen();
	void DrawLine(Vector startPos, Vector endPos);
};

#endif

GraphicsFramework.cpp

#include "GraphicsFramework.hpp"

GraphicsFramework::GraphicsFramework(HDC hdc) {
	this->hdc = hdc;
	this->pen = NULL;
}
GraphicsFramework::~GraphicsFramework() {
	this->DestroyPen();
}

void GraphicsFramework::SetPen(HPEN pen) {
	this->pen = pen;
}

void GraphicsFramework::DestroyPen() {
	if(this->pen != NULL) DeleteObject(this->pen);
}

void GraphicsFramework::DrawLine(Vector startPos, Vector endPos) {
	if(this->pen != NULL) {
		MoveToEx(hdc, start.x, start.y, NULL);
		LineTo(hdc, end.x, end.y);
	}
}

a kompiluje:

g++ -c main.cpp -std=c++11

g++-o main main.o -lgdi32

 

Co robię źle?

 

@edit

Właśnie, zapomniałem podać listę błędów:

main.o:main.cpp:(.text+0x3c): undefined reference to `GraphicsFramework::GraphicsFramework(HDC__*)'
main.o:main.cpp:(.text+0x6d): undefined reference to `GraphicsFramework::SetPen(HPEN__*)'
main.o:main.cpp:(.text+0x133): undefined reference to `GraphicsFramework::DrawLine(Vector, Vector)'
main.o:main.cpp:(.text+0x147): undefined reference to `GraphicsFramework::~GraphicsFramework()'
collect2.exe: error: ld returned 1 exit status

komentarz 6 stycznia przez unknown Nałogowiec (30,020 p.)
Jakie błędy?
komentarz 6 stycznia przez jegor377 Stary wyjadacz (12,730 p.)
właśnie podałem

2 odpowiedzi

+1 głos
odpowiedź 6 stycznia przez unknown Nałogowiec (30,020 p.)
wybrane 6 stycznia przez jegor377
 
Najlepsza

Nie kompilujesz pliku GraphicsFramework.cpp. Powinno być:

g++ -c main.cpp GraphicsFramework.cpp -std=c++11

g++-o main main.o GraphicsFramework.o -lgdi32

 

komentarz 6 stycznia przez jegor377 Stary wyjadacz (12,730 p.)
Dziękuję, działa. Jest może jakiś sposób by nie pisać tych wszystkich includów? Zadeklarowałem je w kodzie. Po co mam je deklarować w komendzie?
1
komentarz 6 stycznia przez unknown Nałogowiec (30,020 p.)
Preprocesor wkleja zawartość plików include'owanych do pliku, w którym te include'y się znajdują. Jest definicja klasy i deklaracje metod, ale nie ma ich definicji, co jednak na poziomie kompilacji nie jest problemem. Jednak przy linkowaniu, linker zamienia referencje do niezdefiniowanych funkcji na adresy. Jednak definicje metod były w innym pliku *.cpp i linker nie mógł znaleźć odpowiednich symboli i ich powiązać.
komentarz 6 stycznia przez jegor377 Stary wyjadacz (12,730 p.)
Czyli trzymać metody w pliku .hpp? Szczerze to wolę taką drogę, jednak nwm czy jest to dobra droga.
komentarz 7 stycznia przez unknown Nałogowiec (30,020 p.)
Takie podejście powinno się raczej stosować przy małych klasach i klasach szablonowych.
komentarz 7 stycznia przez jegor377 Stary wyjadacz (12,730 p.)
Będę dziedziczył klasy, to się powinny zmniejszyć. Te ostateczne może będę dawał w plik cpp. W sumie to w c# wszystko trzymam w jednym pliku i nie sprawia to problemu. Tak czy siak, dziękuję za pomoc. :)
+1 głos
odpowiedź 6 stycznia przez Michał Muzyka Stary wyjadacz (12,190 p.)
void GraphicsFramework::DrawLine(Vector startPos, Vector endPos) {
    if(this->pen != NULL) {
        MoveToEx(hdc, start.x, start.y, NULL);
        LineTo(hdc, end.x, end.y);
    }
}

czy w tym MoveToEx, nie powinno być startPos i endPos?

i nie wiem czy do konstruktora klasy nie powinieneś wysyłać referencji
 

komentarz 6 stycznia przez jegor377 Stary wyjadacz (12,730 p.)
Tak, wszystko poprawiłem. Dzięki :)

Podobne pytania

–1 głos
4 odpowiedzi 104 wizyt
pytanie zadane 5 marca w C i C++ przez WhiteHartLane Nowicjusz (170 p.)
0 głosów
1 odpowiedź 162 wizyt
0 głosów
1 odpowiedź 74 wizyt
pytanie zadane 27 lipca 2016 w C i C++ przez jegor377 Stary wyjadacz (12,730 p.)
...