anek155 Temat założony przez niniejszego użytkownika |
[C++] Linkowanie - pliki nagłówkowe i źródłowe » 2014-10-31 02:56:34 Mam problem z linkowaniem plików między plikami nagłówkowymi i źródłowymi. Bardzo proszę o pomoc, szczególnie o jakieś łopatologiczne wytłumaczenie błędu z linkowaniem który popełniłem (o ile nie jest to literówka), ponieważ już któryś raz go robię i nie mogę znaleźć. Log kompilacji: Kompilator: Default compiler Building Makefile: "D:\*****\Lab 03\Makefile.win" Wykonywanie make... make.exe -f "D:\*****\Lab 03\Makefile.win" all g++.exe main_shape.o -o "Shape.exe" -L"lib"
main_shape.o(.text+0x28e):main_shape.cpp: undefined reference to `prostakat::prostakat(double, double)' collect2: ld returned 1 exit status
make.exe: *** [Shape.exe] Error 1
Wykonanie zakończone
main: #include <iostream> #include <string> #include <math.h> #include <time.h> #include "prostakat.hpp" #include "cshape.hpp" using namespace std; int main() { srand( time( NULL ) ); const int i = 10; Shape * tab[ i ]; double a, b; for( int j = 0; j < i; j++ ) { a = rand() % 50 + 1; b = rand() % 50 + 1; switch( rand() % 3 ) { case 0: { tab[ j ] = new prostakat( a, b ); cout << "Pole prostokąta wynosi: " << tab[ j ]->pole() << endl; break; } } } system( "PAUSE" ); return 0; } Shape.hpp: #ifndef cshape_hpp #define cshape_hpp #include <string> #include <math.h> using namespace std; class Shape { protected: double field; public: Shape( double polE = 0 ); virtual double pole(); }; #endif
Shape.cpp #include "cshape.hpp" Shape::Shape( float polE ) { field = 0; } virtual float Shape::pole() { return 0; }
prostakat.hpp: #ifndef prostakat_hpp #define prostakat_hpp #include "cshape.hpp" #include <string> using namespace std; class prostakat : public Shape { protected: double b; double a; public: prostakat( double x, double y ); double pole(); }; #endif
prostakat.cpp: #include "prostakat.hpp" prostakat::prostakat( double x, double y ) { a = x; b = y; } double prostakat::pole() { return = a * b; }
|
|
Atexor |
» 2014-11-01 15:45:15 1. Masz niezgodności nazw plików z załączanymi plikami, np. mówisz że masz plik "Shape.hpp", a include'ujesz do pliku Shape.cpp plik nagłówkowy "cshape.hpp".
Shape.hpp =/= cshape.hpp
W mainie i prostokat.hpp także zamień na #include "Shape.hpp"
2. W pliku Shape.hpp tworzysz metodę wirtualną pole typu double, zaś w pliku cpp masz typ float. Zamień na double (i w cpp usuń "virtual").
3. Podobnie masz w konstruktorze Shape. Dajesz mu argument typu double, a w ciele funkcji masz float.
4. W pliku prostakat.cpp nie możesz zwracać "return = a * b" w takiej formie, tylko return ( a * b).
|
|
anek155 Temat założony przez niniejszego użytkownika |
» 2014-11-03 00:57:56 Dziękuję za odpowiedź. Literówki poprawiłem (w programie). Dodałem: : Shape(field) w definicji konstruktora prostakat.cpp i field=a*b wewnątrz; pole() zwraca teraz field. Po złożeniu całości do jednego pliku działa prawidłowo. -> nie mogę znaleźć błędu linkowania, za Shape jest wpisane cshape ( źle wpisałem na forum). Nowa wersja: main: #include <iostream> #include <string> #include <math.h> #include <time.h>
#include "p.hpp" #include "s.hpp"
using namespace std;
int main() { srand( time( NULL ) ); const int i = 10; s * tab[ i ]; double a, b; for( int j = 0; j < i; j++ ) { a = rand() % 50 + 1; cout << " a wynosi= " << a << endl; b = rand() % 50 + 1; cout << " b wynosi= " << b << endl; switch( 0 ) { case 0: { tab[ j ] = new p( a, b ); cout << "Pole prostokąta " << " wynosi: " << tab[ j ]->pole() << endl; break; } } } system( "PAUSE" ); return 0; }
s.hpp // klasa Shape #ifndef s_hpp #define s_hpp #include <string> #include <math.h> using namespace std; class s { protected: double field; public: s( double field ); virtual double pole(); void test(); }; #endif
s.cpp #include "s.hpp" s::s( double field ) { field = 0; cout << "tworzenie shape" << endl; } double s::pole() { return 0; }
p.hpp // klasa prostakat #ifndef p_hpp #define p_hpp #include "s.hpp" #include <string> using namespace std; class p : public s { protected: double b; double a; public: p( double x, double y ); double pole(); }; #endif
p.cpp #include "p.hpp" p::p( double x, double y ) : s( field ) { a = x; b = y; field = a * b; } double p::pole() { return field; }
log: Kompilator: Default compiler Building Makefile: "D:\...\Makefile.win" Wykonywanie make... make.exe -f "D:\...\Makefile.win" all g++.exe -c main_shape_ver_all_in_one.cpp -o main_shape_ver_all_in_one.o -I"lib/gcc/mingw32/3.4.2/include" -I"include/c++/3.4.2/backward" -I"include/c++/3.4.2/mingw32" -I"include/c++/3.4.2" -I"include"
g++.exe main_shape_ver_all_in_one.o -o "Shape.exe" -L"lib"
main_shape_ver_all_in_one.o(.text+0x2b8):main_shape_ver_all_in_one.cpp: undefined reference to `p::p(double, double)' collect2: ld returned 1 exit status
make.exe: *** [Shape.exe] Error 1
Wykonanie zakończone
|
|
pekfos |
» 2014-11-03 14:57:40 -> nie mogę znaleźć błędu linkowania, za Shape jest wpisane cshape ( źle wpisałem na forum). |
g++.exe main_shape.o -o "Shape.exe" -L"lib"
|
Masz to wszystko w jakimś projekcie..? Linkujesz tylko main_shape.o. |
|
anek155 Temat założony przez niniejszego użytkownika |
» 2014-11-03 22:17:48 main, p.hpp i s.hpp w projekcie, p i s .cpp w tym samym folderze co reszta projektu. |
|
Atexor |
» 2014-11-03 22:56:45 Do pliku s.hpp dodaj bibliotekę: #include <iostream> |
|
anek155 Temat założony przez niniejszego użytkownika |
» 2014-11-03 23:32:16 Niestety bez reakcji |
|
Atexor |
» 2014-11-03 23:52:30 Hmmm, ciekawe. Nie masz może jakichś "szczątkowych" plików projektu? Jakiego używasz programu do robienia swojego? Code::blocks? Dev C++? Z ciekawości stworzyłem u siebie projekt w MS Visual z Twoimi plikami (tylko zamiast .hpp mam pliki .h, gdyż Visual ma inne rozszerzenie). Następnie dodałem brakującą bibliotekę <iostream> do s.h i program odpalił: http://i.imgur.com/IFYpsyc.jpgNastępnie analogicznie w Code::blocks: http://i.imgur.com/hJVKsxV.jpgJestem niemalże pewien, że coś masz nie tak z plikami projektu albo z samym kompilatorem/programem. |
|
« 1 » 2 |