title: undefined reference to function declared in *.h file
body: <p>I am a unskilled programmer and new to linux, I run into a problem when complining. I have two files 'ex_addinst.c' and 'lindo.h' in the same folder, I input command :</p>
  
  <pre><code>g++ -c ex_addinst.c
  </code></pre>
  
  <p>then, a object file ex_addinst.o is genetated with a warning: </p>
  
  <pre><code>ex_addinst.c: In function ‘int main()’:
  ex_addinst.c:80: warning: deprecated conversion from string constant to ‘char*’
  </code></pre>
  
  <p>then I leak them with</p>
  
  <pre><code>g++ -Wall -o ex_addinst ex_addinst.o
  </code></pre>
  
  <p>and get the following info:</p>
  
  <pre><code>ex_addinst.o: In function `main':
  ex_addinst.c:(.text+0x2b): undefined reference to `LSloadLicenseString'
  ex_addinst.c:(.text+0x75): undefined reference to `LSgetVersionInfo'
  ex_addinst.c:(.text+0xae): undefined reference to `LScreateEnv'
  ex_addinst.c:(.text+0x10a): undefined reference to `LSgetErrorMessage'
  ...
  ...
  ex_addinst.c:(.text+0x1163): undefined reference to `LSdeleteEnv'
  collect2: ld returned 1 exit status
  </code></pre>
  
  <p>I guess that the header file 'lindo.h' is not complied into the .o file, but I have no idea what to do now. I have tried gcc, but get the same error. the version of my g++ and gcc is 4.4.5. I am using Ubuntu 10.10.</p>
  
  <p>All the functions and structures have been declared in 'lindo.h'.</p>
  
  <p>part of ex_addinst.c is as follows:</p>
  
  <pre><code>    #include &lt;stdio.h&gt;
      #include &lt;stdlib.h&gt;
      /* LINDO API header file */
      #include "lindo.h"
          enter code here
  int CALLTYPE LSwriteMPIFile(pLSmodel pModel,
                               char     *pszFname);
  
  
  /* Define a macro to declare variables for
      error checking */
  #define APIERRORSETUP  \
     int nErrorCode; \
     char cErrorMessage[LS_MAX_ERROR_MESSAGE_LENGTH] \
  /* Define a macro to do our error checking */
  #define APIERRORCHECK  \
     if (nErrorCode) \
     { \
        if ( pEnv) \
        { \
           LSgetErrorMessage( pEnv, nErrorCode, \
            cErrorMessage); \
           printf("nErrorCode=%d:  %s\n", nErrorCode, \
            cErrorMessage); \
        } else {\
           printf( "Fatal Error\n"); \
        } \
        exit(1); \
     } \
  
  #define APIVERSION \
  {\
      char szVersion[255], szBuild[255];\
      LSgetVersionInfo(szVersion,szBuild);\
      printf("\nLINDO API Version %s built on %s\n",szVersion,szBuild);\
  }\
  /* main entry point */
  int main()
  {
     APIERRORSETUP;
     pLSenv pEnv;
     pLSmodel pModel;
     char MY_LICENSE_KEY[1024];
  
   /*****************************************************************
    * Step 1: Create a model in the environment.
    *****************************************************************/
     nErrorCode = LSloadLicenseString("home/li/work/tools/lindo/lindoapi/license/lndapi60.lic", MY_LICENSE_KEY);
     if ( nErrorCode != LSERR_NO_ERROR)
     {
        printf( "Failed to load license key (error %d)\n",nErrorCode);
        exit( 1);
     }
  ......
  ......
  ......
     APIERRORCHECK;
     {
        int nStatus;
        double objval=0.0, primal[100];
        /* Get the optimization result */
        nErrorCode = LSgetInfo(pModel, LS_DINFO_GOP_OBJ, &amp;objval);
        APIERRORCHECK;
        LSgetMIPPrimalSolution( pModel, primal) ;
        APIERRORCHECK;
        printf("\n\nObjective = %f \n",objval);
        printf("x[0] = %f \n",primal[0]);
        printf("x[1] = %f \n",primal[1]);
        /* Get the linearity of the solved model */
        nErrorCode = LSgetInfo (pModel, LS_IINFO_GOP_STATUS, &amp;nStatus);
        APIERRORCHECK;
        /* Report the status of solution */
        if (nStatus==LS_STATUS_OPTIMAL || nStatus==LS_STATUS_BASIC_OPTIMAL)
        printf("\nSolution Status: Globally Optimal\n");
        else if (nStatus==LS_STATUS_LOCAL_OPTIMAL)
        printf("\nSolution Status: Locally Optimal\n\n");
        else if (nStatus==LS_STATUS_INFEASIBLE)
        printf("\nSolution Status: Infeasible\n\n");
     }
  
   /* &gt;&gt;&gt; Step 7 &lt;&lt;&lt; Delete the LINDO environment */
     LSdeleteEnv(&amp;pEnv);
  
    /* Wait until user presses the Enter key */
     printf("Press &lt;Enter&gt; ...");
     getchar();
  }
  </code></pre>
  
  <p>part of 'lindo.h' is: </p>
  
  <pre><code>/*********************************************************************
   * Structure Creation and Deletion Routines (4)                      *
   *********************************************************************/
  
   pLSenv CALLTYPE LScreateEnv(int     *pnErrorcode,
                               char    *pszPassword);
  
   pLSmodel CALLTYPE LScreateModel(pLSenv pEnv,
                               int     *pnErrorcode);
  
   int CALLTYPE LSdeleteEnv(pLSenv *pEnv);
  
  
   int CALLTYPE LSdeleteModel(pLSmodel *pModel);
  
  
   int CALLTYPE LSloadLicenseString(char *pszFname, char *pachLicense);
  
   void CALLTYPE LSgetVersionInfo(char *pachVernum, char    *pachBuildDate);
  </code></pre>
  
  <p>Thank you!</p>
  
  <hr>
  
  <p>Thank you guys answering my problem. As you suggested, I need to link the library when complining. I have gotten the executable file with:</p>
  
  <pre><code>gcc -o ex_addinst  ./ex_addinst.o -L/home/li/work/tools/lindo/lindoapi/bin/linux64 -m64 -llindo64  -lmosek64 -lconsub3 -lc -ldl -lm -lguide -lpthread -lsvml -limf -lirc
  </code></pre>
  
  <p>but there comes another problem when run the executable file <strong>ex_addinst</strong>: after run:</p>
  
  <pre><code>./ex_addinst
  </code></pre>
  
  <p>there comes:</p>
  
  <pre><code>./ex_addinst: error while loading shared libraries: liblindo64.so.6.0: cannot open shared object file: No such file or directory
  </code></pre>
  
  <p>The tricky thing is, <strong>liblindo64.so.6.0</strong> is in the lib folder which contains:</p>
  
  <pre><code>libconsub3.so  libirc.so          liblindojni.so        libmosek64.so.5.0  lindo.par
  libguide.so    liblindo64.so      liblindojni.so.6.0.3  libsvml.so         placeholder
  libimf.so      liblindo64.so.6.0  libmosek64.so         lindoapivars.sh    runlindo
  </code></pre>
  
  <p>I have created symbolic links between <strong>liblindo64.so.6.0</strong> and <strong>liblindo64.so</strong> with </p>
  
  <pre><code>ln -sf liblindo64.so.6.0 liblindo64.so
  </code></pre>
  
  <p>but it doesn't help.</p>
  
  <p>Can anyone tell me what is wrong here?</p>
  
  <p>(I am not sure I should put this question in a new post, but I think currently it is better to follow the old one)</p>