Stricto sensu, компилятор и компоновщик - это разные вещи (и я не уверен, что стандарт C говорит о компиляции и компоновке, он более абстрактно говорит о проблемах перевода и реализации).
Например, в Linux вы часто используете gcc
для перевода вашего hello.c
исходного файла, а gcc
- это «управляющая программа», которая запускает компилятор cc1
, ассемблер as
, компоновщик ld
и т. Д.
В Linux заголовок <stdio.h>
- это обычный файл. Запустите gcc -v -Wall -H hello.c -o hello
, чтобы понять, что происходит. Опция -v
просит gcc
показать вам используемые программы (cc1
и другие). Флаг -Wall
запрашивает все предупреждения (не игнорируйте их!). Флаг -H
просит компилятор показать вам файлы заголовков, которые включены.
Заголовочный файл /usr/include/stdio.h
является #include
-из себя другими заголовками. В какой-то момент объявление printf
видно, и компилятор анализирует его и соответственно корректирует его состояние.
Позже команда gcc
запустит компоновщик ld
и попросит его связать стандартную библиотеку C (в моей системе /usr/lib/x86_64-linux-gnu/libc.so
). Эта библиотека содержит код [object] printf
Я не уверен, что понял ваш вопрос. Чтение страницы Википедии о компиляторах , компоновщиках , ядре Linux , системных вызовах должно быть полезно.
Вы не должны хотеть gcc
автоматически связывать ваши собственные дополнительные библиотеки. Это было бы сбивающим с толку. (но если вы действительно хотите сделать это с GCC, прочитайте о файле спецификаций GCC )