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