What causes the error "undefined reference to (some function)"?
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)).
Related videos on Youtube
Piseagan
Updated on November 06, 2020Comments
-
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 over 12 yearsWell 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 over 12 yearsOh, 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 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
oraverge_columns
are both easier to spot thanavergecolumns
.