title: C++ linker problems with static method
body: <p>I'm writing a Vector3D class that calls a static method on a VectorMath class to perform a calculation. When I compile, I get this:</p>
  
  <pre>
  bash-3.1$ g++ VectorMath.cpp Vector3D.cpp
  /tmp/cc5cAPia.o: In function `main':
  Vector3D.cpp:(.text+0x4f7): undefined reference to 'VectorMath::norm(Vector3D*)'
  collect2: ld returned 1 exit status
  </pre>
  
  <p>The code:</p>
  
  <p><b>VectorMath.h:</b></p>
  
  <pre><code>#ifndef VECTOR3D_H
  #include "Vector3D.h"
  #endif
  
  class VectorMath {
      public:
      static Vector3D* calculatePerpendicularVector(Vector3D*, Vector3D*);
      static Vector3D* norm(Vector3D*);
      static double length(Vector3D*);
  };
  </code></pre>
  
  <p><b>VectorMath.cpp</b></p>
  
  <pre><code>#include "VectorMath.h"
  Vector3D* norm(Vector3D* vector) { // can't be found by linker
      // do vector calculations
      return new Vector3D(xHead, yHead, zHead, xTail, yTail, zTail);
  }
  // other methods
  </code></pre>
  
  <p><b>Vector3D.cpp</b></p>
  
  <pre><code>#include "Vector3D.h"
  #include "VectorMath.h"
  // ...
  // vector implementation
  // ...
  int main(void) {
      Vector3D* v = new Vector3D(x, y, z);
      Vector3D* normVector = VectorMath::norm(v); // error here
  }        
  </code></pre>
  
  <p>Why can't the linker find the <code>VectorMath::norm</code> method? At first glance I'd think that I'd need to declare norm like this:</p>
  
  <pre><code>Vector3D* VectorMath::norm(Vector3D* vector) {
  </code></pre>
  
  <p>but that doesn't help either...</p>