Как связать несколько файлов реализации в C
У меня есть ряд .c
файлы, т.е. файлы реализации говорят
- main.c
- переменный ток
- До нашей эры
Где функции из любого файла могут вызывать любую функцию из разных файлов. Мой вопрос в том, нужно ли мне .h
то есть файл заголовка для каждой реализации A и B, где каждый файл заголовка имеет определение ВСЕХ функций в A или B.
Кроме того, main.c будет иметь оба A.h
а также B.h #included
в этом?
Если кто-то может, наконец, прояснить это, также, как мне позже скомпилировать и запустить несколько файлов в терминале.
Благодарю.
3 ответа
Содержимое заголовка
Заголовок A.h
за A.c
должен содержать только ту информацию, которая необходима для внешнего кода, использующего средства, определенные в A.c
, Он не должен объявлять статические функции; он не должен объявлять статические переменные; он не должен объявлять внутренние типы (типы, используемые только в A.c
). Следует убедиться, что файл может использовать только #include "A.h"
а затем в полной мере использовать средства, опубликованные A.c
, Он должен быть автономным и идемпотентным (чтобы вы могли включить его дважды без ошибок компиляции). Вы можете просто проверить, что заголовок автономен, написав #include "A.h"
как первый #include
линия в A.c
; Вы можете проверить, что он идемпотентен, включив его дважды (но это лучше сделать отдельным тестом). Если он не компилируется, он не самодостаточен. Аналогично для B.h
а также B.c
,
Для получения дополнительной информации о заголовках и стандартах см. " Должен ли я использовать #include
в заголовках? ', который ссылается на стандарт кодирования NASA, и' Связывание со статической библиотекой ', который включает скрипт chkhdr
что я использую для проверки самодостаточности и идемпотентности.
соединение
Обратите внимание, что main.o
зависит от main.c
, A.h
а также B.h
, но main.c
Сам не зависит от заголовков.
Когда дело доходит до компиляции, вы можете использовать:
gcc -o program main.c A.c B.c
Если вам нужны другие опции, добавьте их (большинство флагов в начале; библиотеки в конце, после исходного кода). Вы также можете скомпилировать каждый файл в объектный код отдельно, а затем связать объектные файлы вместе:
gcc -c main.c
gcc -c A.c
gcc -c B.c
gcc -o program main.o A.o B.o
Это будет зависеть от компилятора, но если вы используете gcc, вы можете использовать что-то вроде этого:
gcc -Wall main.c A.c B.c -o myoutput
Посмотрите http://www.network-theory.co.uk/docs/gccintro/gccintro_11.html (первый ответ Google) для получения дополнительной информации. Вы можете скомпилировать его в несколько объектных файлов / библиотек:
gcc -c main.c
gcc -c A.c
gcc -c B.c
gcc -o mybin main.o A.o B.o
Вы должны предоставить файл заголовка, только если то, что объявлено в .c
файл требуется в другом .c
файл.
Вообще говоря, вы можете иметь заголовочный файл для каждого исходного файла, в который вы экспортируете все объявленные функции или extern
символы.
На практике вам не всегда нужно экспортировать каждую функцию или каждую переменную, только ту, которая требуется для другого исходного файла, и вам нужно будет включить ее только в нужный файл (и в исходный файл в сочетании с конкретным заголовочным файлом).).
Пытаясь понять, как это работает, просто подумайте о том, что каждый исходный файл скомпилирован сам по себе, поэтому, если он собирается использовать что-то, что не объявлено непосредственно в его исходном файле, то это должно быть объявлено через заголовочный файл. Таким образом, компилятор может знать, что все существует, и он правильно напечатан.
Вы хотите использовать
gcc -g *.c -lm
Это экономит ввод текста и позволит вам связать все ваши файлы c в вашем проекте.