Компиляция нескольких файлов 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, которые являются "заголовками". Поэтому, если ваш основной файл использует модули, вы должны включить заголовочный файл модуля.