What causes the error "undefined reference to (some function)"?

163,565

It's a linker error. ld is the linker, so if you get an error message ending with "ld returned 1 exit status", that tells you that it's a linker error.

The error message tells you that none of the object files you're linking against contains a definition for avergecolumns. The reason for that is that the function you've defined is called averagecolumns (in other words: you misspelled the function name when calling the function (and presumably in the header file as well - otherwise you'd have gotten a different error at compile time)).

Share:
163,565

Related videos on Youtube

Piseagan
Author by

Piseagan

Updated on November 06, 2020

Comments

  • Piseagan
    Piseagan over 3 years

    I get the error:

    main.o(.text+0x1ed): In function `main':
    : undefined reference to `avergecolumns'
    collect2: ld returned 1 exit status
    

    when I gcc *.o. I'm not quite sure what causes this error. Other posters have explained it as the function is not found or the function is empty. If someone could clarify or refine, it would be greaty appreciated!

    Here is my function's code(I'm trying to calculate the average of the column in 2D arrays):

    #include "my.h"
    
    void averagecolumns (int x, int y, int** a)
    {
        int i;
        int j;
        float sum;
        float colAvg;
    
        sum = 0;
        colAvg = 0;
    
        printf("i.  The column averages are: \n");
        for(i = 0; i < x; i++)
            {
                for(j = 0; j < y; j++)
                    {
                        sum += a[i][j];
                        colAvg = sum / (float)x;
                    }
                printf("Column: %3d, Average: %6.2f", j, colAvg);
                sum = 0;   
                colAvg = 0;
            }
    

    The relavent parts of main are:

    #include "my.h"
    
    int main (int argc, char* argv[])
    {
         int** a;
         float** colAvg;
         int ROWS;
         int COLS;
         int i;
         int j;
         int** table;
         FILE* fpmyfile;
         int closeResult;
    
    ....
    
                 printme (ROWS, COLS, a);                              // call functions a - j
                 oddvalues (ROWS, COLS, a);
                 oddlocations (ROWS, COLS, a);
                 countoddrows (ROWS, COLS, a);
                 addrows (ROWS, COLS, a);
                 findfirstsmall (ROWS, COLS, a);
                 findlastlarge (ROWS,COLS, a);                          
                 addcolumns (ROWS, COLS, a);
                 avergecolumns (ROWS, COLS, a);
    
    ....
    
    }
    

    Also, is this a linker or a compile error (I wasn't sure which tag to add).

  • Kerrek SB
    Kerrek SB over 12 years
    Well spotted! Another example why Short Is Good, and in a crunch names like "average" and "column" are a liability -- yay for usr, tmp and lib :-)
  • Piseagan
    Piseagan over 12 years
    Oh, thanks for explaining what the ld means! I feel quite silly having not seen the misspelling. I'll keep the naming convention in mind! Thanks again! :)
  • Aaron Dufour
    Aaron Dufour over 12 years
    @Piseagan Using a convention that makes it clear where breaks between words in a variable/function are also makes catching typos easier. Camelcase and underscores are both good choice - i.e. avergeColumns or averge_columns are both easier to spot than avergecolumns.