2011-08-16 1 views
5
/me/home/file1.c containes function definition: 

int mine(int i) 
{ 
    /* some stupidity by me */ 
} 

Я объявил эту функцию вс использованием функции в различных .c файлов (с программированием 101)

/me/home/file1.h 

int mine(int); 

, если я хочу, чтобы использовать эту функцию mine() в /me/home/at/file2.c

Для этого , все, что мне нужно сделать, это:

file2.c 

#include "../file1.h" 

Этого достаточно? Возможно нет.

После этого много, когда я компилирую file2.c, я получаю undefined reference to 'mine'

ответ

6

Вам также необходимо связать объектный файл из file1. Пример:

gcc -c file2.c 
gcc -c ../file1.c 
gcc -o program file2.o file1.o 

Или вы также можете накормить все файлы одновременно, и пусть GCC сделать работу (не предложила за пределами несколько файлов);

gcc -o program file1.c file2.c 
+0

Спасибо Янн. Как я могу сделать это в Makefile? – hari

+1

Как правило, вы можете избежать указания только объектных файлов, и GCC достаточно умен, чтобы сделать все остальное. I.e .: 'program: file1.o file2.o \ n \ tgcc -o program file1.o file2.o' –

+0

Большое спасибо за подсказку. – hari

1

Не используйте ../ в заголовке. Вместо указания GCC использовать родительский каталог, включают в себя путь:

(в в каталоге):

gcc -I../ -c file2.c 
+0

Иногда есть веские причины не делать -I ../, я бы не зашел так далеко, чтобы сказать «не использовать ../» - это хорошее общее правило. – George

1

После этого много, когда я компилирую file2.c, я получаю неопределенную ссылку 'mine'

Нет, вы этого не сделаете. Это не компиляция, которая вызывает эти ошибки. Это еще одна вещь, называемая «связывание».

Компилятор компилирует одну «единицу перевода» - результат запуска препроцессора в одном исходном файле, возможно, затягивая больше вещей через #include - за один раз, а затем компоновщик объединяет их вместе для создания исполняемого файла. Как правило, одна и та же программа служит как компилятором, так и компоновщиком с разными флагами, и обычно вы можете сказать ему делать все сразу (и не сохранять временные файлы для скомпилированных единиц перевода). Но вам нужно сказать, что нужно связывать, и вам нужно собрать все, что будет связано.

+0

Спасибо за подробный ответ. – hari

 Смежные вопросы

  • Нет связанных вопросов^_^