Search code examples
c++oopcompilationformulahaversine

c++ error "undefined reference to GPScoord::(double,double) etc."


main.cc

#include <iostream>
#include <cstdlib>
#include <string>
#include "gps.h"

using namespace std;

int main(int argc, char  *argv[])
{

  GPScoord  gps1(12.0,13.0);
  GPScoord  gps2(12.0,13.0);

  cout<<gps1.distance_to(gps2)<<endl;

  return 0;
}

gps.h

#ifndef GPS_H
#define GPS_H

class GPScoord {
  public:
  GPScoord(double lat, double longt);

  double lattitude1();
  double longtitude1();
  double rad_lat();
  double rad_long();
  double  distance_to(const GPScoord&  gps );
  private:
  double lattitude;
  double longtitude;
};

#endif

gps.cc

#include <cstdlib>
#include <iostream>
#include <cmath>
#include <math.h>
#include "gps.h"
using namespace  std;

class GPScoord 
{
  private:
  double lattitude;
  double longtitude;
  public:
    GPScoord(double lat,double longt) {

    lattitude=lat;
    longtitude=longt;
  }

  public:
  double lattitude1(){ return lattitude; }
  double longtitude1(){ return longtitude; }
  double rad_lat(){ return lattitude*M_PI/180; }
  double rad_long(){ return longtitude*M_PI/180; }

  double  distance_to(const GPScoord&   gps ){
  double R = 6371e3;
  double radlat = rad_lat();
  double ralong = rad_long();
  double radlat1 = gps.rad_lat();
  double radlong1 = gps.rad_long();
  double radlat2 = radlat-radlat1;
  double radlong2 = ralong-radlong1;
  double          a = pow((sin(radlat2/2)),2)+cos(radlat)*
  cos(radlat1)*pow((sin(radlong2)),2);
  double c=2*atan2(sqrt(a),sqrt(1-a));
  return R*c;
}

};

I get the following error:

/tmp/cc13HrVO.o: In function `main':
/home/mustafa/Desktop/main.cc:14: undefined reference to     `GPScoord::GPScoord(double, double)'
/home/mustafa/Desktop/main.cc:15: undefined reference to       `GPScoord::GPScoord(double, double)'
/home/mustafa/Desktop/main.cc:17: undefined reference to   `GPScoord::distance_to(GPScoord const&)'
collect2: error: ld returned 1 exit status

I did't understand this error, 12.0 is not double or gps2 is not class? I think this problem is in the gps.h but I didn't find this error.


Solution

  • First, you need to compile both the source files, like this:

    g++ -Wall main.cc gps.cc

    Then you will see that you receive an error of redefining your class, which as explained here can be fixed by defining the class in the header file and then implement the methods of your class to the source file, without having to redefine the class.

    After that you will get errors like this:

    gps.cc:21:19: error: member function 'rad_lat' not viable: 'this' argument has
          type 'const GPScoord', but function is not marked const
      double radlat = rad_lat();
                      ^~~~~~~
    

    which happen, just as the compiler says, because some functions need to be marked as const. Putting them all together you will get something like the code below:

    gps.h:

    #ifndef GPS_H
    #define GPS_H
    
    class GPScoord {
      public:
      GPScoord(double lat, double longt);
    
      double lattitude1();
      double longtitude1();
      double rad_lat() const;
      double rad_long() const;
      double  distance_to(const GPScoord&  gps ) const;
      private:
      double lattitude;
      double longtitude;
    };
    
    #endif
    

    gps.cc:

    #include <cstdlib>
    #include <iostream>
    #include <cmath>
    #include <math.h>
    #include "gps.h"
    using namespace  std;
    
    GPScoord::GPScoord(double lat,double longt) {
    
        lattitude=lat;
        longtitude=longt;
    }
    
    double GPScoord::lattitude1(){ return lattitude; }
    double GPScoord::longtitude1(){ return longtitude; }
    double GPScoord::rad_lat() const { return lattitude*M_PI/180; }
    double GPScoord::rad_long() const { return longtitude*M_PI/180; }
    
    double  GPScoord::distance_to(const GPScoord&   gps ) const {
      double R = 6371e3;
      double radlat = rad_lat();
      double ralong = rad_long();
      double radlat1 = gps.rad_lat();
      double radlong1 = gps.rad_long();
      double radlat2 = radlat-radlat1;
      double radlong2 = ralong-radlong1;
      double          a = pow((sin(radlat2/2)),2)+cos(radlat)*
      cos(radlat1)*pow((sin(radlong2)),2);
      double c=2*atan2(sqrt(a),sqrt(1-a));
      return R*c;
    }