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

[C++] Linkowanie - pliki nagłówkowe i źródłowe

Ostatnio zmodyfikowano 2014-11-04 01:49
Autor Wiadomość
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:
C/C++
#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 ); /*<- przy kompilacji usunięcie tego fragmentu powoduje uruchomienie konsoli(która nic nie robi)*/ cout << "Pole prostokąta wynosi: " << tab[ j ]->pole() << endl; break; }
           
        }
    }
    system( "PAUSE" );
    return 0;
}

Shape.hpp:
C/C++
#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
C/C++
#include "cshape.hpp"
Shape::Shape( float polE )
{
    field = 0;
   
}
virtual float Shape::pole()
{
    return 0;
}

prostakat.hpp:
C/C++
#ifndef prostakat_hpp
#define prostakat_hpp
#include "cshape.hpp"
#include <string>
using namespace std;
class prostakat
    : public Shape
{
protected:
    double b; //wysokosc
    double a; //podstawa
   
public:
    prostakat( double x, double y );
    double pole();
};
#endif

prostakat.cpp:
C/C++
#include "prostakat.hpp"
prostakat::prostakat( double x, double y )
{
    a = x;
    b = y;
}
double prostakat::pole()
{
    return = a * b;
}

P-119715
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).
P-119805
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:
C/C++
#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
C/C++
#ifndef s_hpp
#define s_hpp
#include <string>
#include <math.h>
using namespace std;
class s
{ protected:
    double field;
    // string name;
   
public:
    s( double field );
    virtual double pole();
    void test();
    // virtual string nazwa();
};
#endif


s.cpp
C/C++
#include "s.hpp"
s::s( double field )
{
    field = 0;
    cout << "tworzenie shape" << endl;
}
double s::pole()
{
    return 0;
}


p.hpp // klasa prostakat
C/C++
#ifndef p_hpp
#define p_hpp
#include "s.hpp"
#include <string>
using namespace std;
class p
    : public s
{
protected:
    double b; //wysokosc
    double a; //podstawa
   
public:
    p( double x, double y );
    double pole();
    // string nazwa();  
};
#endif

p.cpp
C/C++
#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
P-119897
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.
P-119920
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.
P-119955
Atexor
» 2014-11-03 22:56:45
Do pliku s.hpp dodaj bibliotekę:
#include <iostream>
P-119959
anek155
Temat założony przez niniejszego użytkownika
» 2014-11-03 23:32:16
Niestety bez reakcji
P-119965
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.jpg

Następnie analogicznie w Code::blocks:
http://i.imgur.com/hJVKsxV.jpg

Jestem niemalże pewien, że coś masz nie tak z plikami projektu albo z samym kompilatorem/programem.
P-119966
« 1 » 2
  Strona 1 z 2 Następna strona