Компиляция нескольких файлов C с помощью gcc
У меня есть два файла, main.o
и modules.o
, и я пытаюсь их скомпилировать, чтобы main.o
мог вызывать функции в modules.o
. Мне прямо сказали не попробовать #include module.o
. Я действительно не знаю, что я должен делать вместо этого. Я пробовал несколько разных версий gcc
(например, gcc -x c driver main.o modules.o
), но ничего не получаю: компилятор непрерывно возвращает
error: called object is not a function
Файлы .o
- это файлы исходного кода (мне было предложено поместить исходный код в файлы с расширением .o
.) Что мне сделать, чтобы скомпилировать это?
Ответы
Ответ 1
Вы должны определить функции, которые вы хотите вызывать из modules.c
в main.c
в файл заголовка, скажем, modules.h
, и включить этот файл заголовка в main.c
Когда у вас есть файл заголовка, скомпилируйте оба файла вместе: gcc main.c modules.c -o output
Две дополнительные заметки. Во-первых, modules.o
- это объектный файл, и его не следует включать в исходный файл C. Во-вторых, мы не можем иметь файл C с расширением .o
. Вы должны получить ошибку при компиляции .o
файла. Что-то вроде:
$ cat t.o
int main() {
int x = 1;
return 0;
}
$
$ gcc t.o
ld: warning: in t.o, file is not of required architecture
Undefined symbols:
"_main", referenced from:
start in crt1.10.6.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
$
Ответ 2
Если у вас есть два исходных файла, вы можете скомпилировать их в объектные файлы, не связывая их так:
gcc main.c -o main.o -c
gcc module.c -o module.o -c
где флаг -c
сообщает компилятору прекратить работу после фазы компиляции без привязки. Затем вы можете связать ваши два объектных файла так:
gcc -o myprog main.o module.o
Это совершенно нормальное поведение, вы обычно получаете свой makefile для компиляции вещей по отдельности и связывания их в конце, поэтому вам не нужно перекомпилировать каждый отдельный исходный файл каждый раз, когда вы меняете один из них.
Говоря о main.o
"вызывающих функциях в" module.o
отлично, но файл .o
не является исходным файлом, это скомпилированный объектный файл. Если "поместить мой исходный код в файлы с расширением .o
" на самом деле означает "скомпилировать исходный код в файлы с расширением .o
", то ситуация будет иметь гораздо больше смысла.
Ответ 3
Вы должны включать файлы .h
, которые являются "заголовками". Поэтому, если ваш основной файл использует модули, вы должны включить заголовочный файл модуля.