title: C C++ Linking Error
body: <p>I am writing a program in C++ which uses the CLAPACK ATLAS library. However, I cannot get the program to link successfully to the library. I have written a small C program to better demonstrate the problem. Interestingly enough, this small demonstration program links just fine if I compile it with GCC, but I get the same linker errors when I try to compile with G++. I was hoping someone could help me figure out exactly what G++ and GCC are doing differently, so as to get the original program to link (The original program is a C++ program and I can't just "use GCC")</p>
  
  <p>Here is the small demonstration program:</p>
  
  <pre><code>#include &lt;stdlib.h&gt;
  #include &lt;stdio.h&gt;
  #include &lt;time.h&gt;
  #include &lt;cblas.h&gt;
  #include &lt;clapack.h&gt;
  
  // a is a column-major array of all the values in the matrix to invert
  // The matrix's height and width are the same because it is a square matrix.
  void invertMatrix(float *a, unsigned int height)
  {
      int info, ipiv[height];
      info = clapack_sgetrf(CblasColMajor, height, height, a, height, ipiv);
      info = clapack_sgetri(CblasColMajor, height, a, height, ipiv);
  }
  
  void displayMatrix(float *a, unsigned int height, unsigned int width)
  {
      int i, j;
      for(i = 0; i &lt; height; i++)
      {
              for(j = 0; j &lt; width; j++)
              {
                      printf("%1.3f ", a[height*j + i]);
              }
              printf("\n");
      }
      printf("\n");
  }
  
  void multiplyMatrix(float *a, unsigned int aheight, unsigned int awidth, float *b, unsigned int bwidth, float *c)
  {
      cblas_sgemm(CblasColMajor, CblasNoTrans, CblasNoTrans, aheight, bwidth, awidth, 1.0f, a, aheight, b, awidth, 0.0f, c, aheight);
  }
  
  int main(int argc, char *argv[])
  {
      int i;
      float a[9], b[9], c[9];
      srand(time(NULL));
      for(i = 0; i &lt; 9; i++)
      {
              a[i] = 1.0f*rand()/RAND_MAX;
              b[i] = a[i];
      }
      displayMatrix(a, 3, 3);
      invertMatrix(a, 3);
      multiplyMatrix(a, 3, 3, b, 3, c);
      displayMatrix(c, 3, 3);
      return 0;
  }
  </code></pre>
  
  <p>And when I try to compile this with GCC, it works just fine:</p>
  
  <pre><code>$ gcc -o linearalgebra linearalgebra.c -I /usr/include/atlas -L /usr/lib64/atlas/ -llapack -lblas
  $ ./linearalgebra
  0.723 0.755 0.753
  0.179 0.912 0.349
  0.642 0.265 0.530
  
  1.000 -0.000 0.000
  0.000 1.000 0.000
  0.000 0.000 1.000
  
  $
  </code></pre>
  
  <p>And when I try to compile this with G++, it gives linker errors:</p>
  
  <pre><code>$ g++ -o linearalgebra linearalgebra.c -I /usr/include/atlas -L /usr/lib64/atlas/ -llapack -lblas
  /tmp/ccuhmDKE.o: In function `multiplyMatrix(float*, unsigned int, unsigned int, float*, unsigned int, float*)':
  linearalgebra.c:(.text+0x7b): undefined reference to `cblas_sgemm(CBLAS_ORDER, CBLAS_TRANSPOSE, CBLAS_TRANSPOSE, int, int, int, float, float const*, int, float const*, int, float, float*, int)'
  /tmp/ccuhmDKE.o: In function `invertMatrix(float*, unsigned int)':
  linearalgebra.c:(.text+0x182): undefined reference to `clapack_sgetrf(CBLAS_ORDER, int, int, float*, int, int*)'
  linearalgebra.c:(.text+0x1a0): undefined reference to `clapack_sgetri(CBLAS_ORDER, int, float*, int, int const*)'
  collect2: ld returned 1 exit status
  $
  </code></pre>
  
  <p>Last but not least: Some information about my system:<br>
  Operating System: <code>Fedora 10 (Linux hostname 2.6.27.25-170.2.72.fc10.x86_64 #1 SMP Sun Jun 21 18:39:34 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux)</code><br>
  Libraries:</p>
  
  <pre><code>$ yum list | grep lapack
  lapack.x86_64                        3.1.1-4.fc10                 installed
  lapack-debuginfo.x86_64              3.1.1-4.fc10                 installed
  lapack-devel.x86_64                  3.1.1-4.fc10                 @fedora
  $ yum list | grep blas
  blas.x86_64                          3.1.1-4.fc10                 installed
  blas-devel.x86_64                    3.1.1-4.fc10                 installed
  $ yum list | grep atlas
  atlas.x86_64                         3.6.0-15.fc10                installed
  atlas-debuginfo.x86_64               3.6.0-15.fc10                installed
  atlas-devel.x86_64                   3.6.0-15.fc10                @fedora
  </code></pre>
  
  <p>Also, for bonus points: What exactly is the historical and functional relationship between LAPACK and ATLAS?</p>