Скажем, у меня есть следующая программа (hello.c
):
#include <stdio.h>
#include <math.h>
#define NAME "ashoka"
int main(int argc, char *argv[])
{
printf("Hello, world! My name is %s\n", NAME);
}
Итак, насколько я понимаю, процесс компиляции:
-
Предварительная обработка: скопирует вставки деклараций stdio.h и math.h и заменит
NAME
на"ashoka"
.clang -E hello.c
-
Компиляция: превратит c в код сборки
clang -S hello.c
: hello.s
-
Сборка: преобразование кода сборки в код объекта
clang -c hello.s
: hello.o
-
Связывание: объединить файлы объектов в один файл, который мы будем выполнять.
clang hello.o -lm
ИЛИ (скажем, я также хочу связать hello2.o)
clang hello.o hello2.o
Итак, вот вопросы:
-
Правильно ли описан процесс?
-
На этапе связывания мы связываем файлы
.o
(Object code). Я знаю, чтоmath.h
находится в каталоге/usr/include
. Гдеmath.o
? Как линкер находит это? -
Что такое
.a
(статические библиотеки) и.so
(динамические библиотеки) в Linux? И как они связаны с файлами.o
и этапом компоновки? -
Скажем, я хочу поделиться библиотекой, которую я создал с миром. У меня есть файл
mylib.c
, в котором я объявил и реализовал свои функции. Как бы я поделился этим, чтобы люди включили его в свои проекты, выполнив либо#include <mylib.h>
, либо#include "mylib.h"
?