Включая исходные файлы в C - PullRequest
       40

Включая исходные файлы в C

5 голосов
/ 14 сентября 2009

Таким образом, я получаю точку заголовков против исходных файлов. Что я не понимаю, так это то, что компилятор знает, как компилировать все исходные файлы. Пример:

example.h

#ifndef EXAMPLE_H
#define EXAMPLE_H

int example(int argument); // prototype

#endif

example.c

#include "example.h"

int example(int argument)
    {
    return argument + 1; // implementation
    }

main.c

#include "example.h"

main()
    {
    int whatever;
    whatever = example(whatever); // usage in program
    }

Как компилятор, компилирующий main.c, знает реализацию example(), когда ничего не включает example.c?

Это что-то вроде среды IDE, где вы добавляете файлы в проекты и прочее? Есть ли способ сделать это «вручную», так как я предпочитаю простой текстовый редактор изворотливым IDE?

Ответы [ 5 ]

9 голосов
/ 14 сентября 2009

Компиляция в C или C ++ фактически разбита на 2 отдельных этапа.

  • компиляции
  • сшивание

Компилятор не знает о реализации example (). Он просто знает, что есть нечто, называемое example (), которое будет определено в какой-то момент. Так что это просто сгенерированный код с заполнителями например ()

Затем появляется компоновщик и разрешает эти заполнители.

Чтобы скомпилировать код с помощью gcc, вы должны сделать следующее

gcc -c example.c -o example.o
gcc -c main.c -o main.o
gcc example.o main.o -o myProgram

Первые 2 вызова gcc являются этапами компиляции. Третий вызов - шаг компоновщика.

5 голосов
/ 14 сентября 2009

Да, вы должны указать компилятору (обычно через make-файл, если вы не используете IDE), какие исходные файлы компилировать в объектные файлы, и компилятор компилирует каждый из них по отдельности. Затем вы даете компоновщику список объектных файлов, которые нужно объединить в исполняемый файл. Если компоновщик ищет определение функции или класса и не может его найти, вы получите ошибку ссылки.

4 голосов
/ 14 сентября 2009

Это не ... вы должны сказать это.
Например, когда вы используете gcc, сначала вы должны скомпилировать файлы:

gcc file1.c -c -ofile1.o
gcc file2.c -c -ofile2.o

Затем компилятор компилирует эти файлы, предполагая, что определенные вами символы (например, ваша примерная функция) существуют где-то и будут связаны позже. Затем вы связываете объектные файлы вместе:

gcc file1.o file2.o -oexecutable

В этот момент компоновщик смотрит на эти предположения и «разъясняет» их, т.е. проверяет, присутствуют ли они. Вот как это в основном работает ...

Что касается вашего вопроса IDE, Google "makefiles"

1 голос
/ 14 сентября 2009

Компилятор не знает реализацию example () при компиляции main.c - компилятор знает только подпись (как ее вызвать), которая была включена из заголовочного файла. Компилятор создает объектные файлы .o, которые впоследствии связываются компоновщиком для создания исполняемого двоичного файла. Процесс сборки может контролироваться IDE или, если вы предпочитаете Makefile. Make-файлы имеют уникальный синтаксис, который требует немного понимания, но сделает процесс сборки намного понятнее. Если вы ищете Makefile, в Интернете есть много хороших ссылок.

0 голосов
/ 14 сентября 2009

Компилятор этого не делает. Но ваш инструмент сборки делает. IDE или make инструмент. Ручной ручной Makefile с.

...