Возможный дубликат: Что такое & ldquo; единица перевода & rdquo; в C ++
Возможен дубликат: Что такое «единица перевода» в C ++
x.h:
void f();
x.c:
void f(){}
main.c:
#include"x.h" int main(){ f(); }
тогда я использую: gcc -o a.out main.c почему говорят, что f - неопределенный символ?
Это ошибка компоновщика.Вам необходимо скомпилировать main.c и x.c одновременно или скомпилировать их отдельно без ссылки и связать получившиеся объектные файлы.
main.c
x.c
Например:
gcc -o x.o -c x.c gcc -o main.o -c main.c gcc -o myexecutable main.o x.o
Это потому, что x.h просто содержит объявление, которое не определяет символ. x.c содержит определение.
x.h
Попробуйте
gcc -o a.out main.c x.c
Следует сказать это во время компиляции, но, вероятно, во время компоновки. Вы еще не скомпилировали x.c (gcc -c x.c)?
Поскольку f не определено в x.h, оно только объявлено. Вам нужно связать x.o с вашим исполняемым файлом. Если вы не используете IDE, вы можете настроить Makefile для обработки этого и вызвать make для создания вашего проекта.
f
x.o
Makefile
make
Вы также должны включить x.h в файл x.c и убедиться, что определение не используется дважды следующим кодом:
#ifndef X_H #define X_H f(); #endif
А затем используйте gcc -o a.out main.c x.c