Это определенно ошибка, так как getdisc
не виден компоновщику, но, если то, что вы говорите правильно, этого не произойдет.
Ваша командная строка gcc
включает в себя graph1.c
, которую, как вы уверены, используете, содержит функцию.
Не беспокойтесь об имени объектного файла, это просто временное имя, созданное компилятором для передачи компоновщику.
Можете ли вы подтвердить (точно вырезать и вставить) используемую командную строку gcc
и показать нам определение функции с некоторым контекстом вокруг нее?
Кроме того, убедитесь, что graph1.c
компилируется, как ожидается, вставив непосредственно перед функцией getdisc
следующую строку:
xyzzy plugh twisty;
Если ваша функция просматривается компилятором, это должно сначала вызвать ошибку . Это может быть что-то вроде ifdef
операторов, приводящих к тому, что ваш код не будет скомпилирован.
В порядке тестирования следующая транскрипция показывает, что то, что вы пытаетесь сделать , прекрасно работает:
pax> cat shells2.c
#include "graph2.h"
int main (void) {
int x = getdisc ();
return x;
}
pax> cat graph2.h
int getdisc (void);
pax> cat graph1.c
int getdisc (void) {
return 42;
}
pax> gcc -o rr4 shells2.c graph1.c
pax> ./rr4
pax> echo $?
42
Поэтому мы должны предположить, что то, что вы на самом деле делаете, является чем-то другим, и это необычно тактично для меня: -)
То, что вы испытываете, это то, что происходит с чем-то вроде:
pax> gcc -o rr4 shells2.c
/tmp/ccb4ZOpG.o: In function `main':
shells2.c:(.text+0xa): undefined reference to `getdisc'
collect2: ld returned 1 exit status
или если getdisc
было , а не , объявлено правильно в graph1.c
.
Этот последний случай может быть по многим причинам, включая, но не ограничиваясь:
- неправильное написание
getdisc
.
#ifdef
операторы типа, означающие, что определение никогда не видели (хотя вы, кажется, обесценили это в комментарии).
- некоторые шутки, использующие
#define
для изменения getdisc
на что-то другое (маловероятно, но возможно).