Сборка .so файла из .c файла с использованием командной строки gcc

162

Я пытаюсь создать проект hello world для динамических библиотек Linux (файлы .so). Итак, у меня есть файл hello.c:

#include <stdio.h>
void hello()
{
    printf("Hello world!\n");
}

Как мне создать .so файл, который экспортирует hello(), используя gcc из командной строки?

sashoalm
источник

Ответы:

293

Чтобы сгенерировать разделяемую библиотеку, сначала нужно скомпилировать код на языке C с -fPICфлагом (независимый от положения код).

gcc -c -fPIC hello.c -o hello.o

Это сгенерирует объектный файл (.o), теперь вы берете его и создаете .so файл:

gcc hello.o -shared -o libhello.so

РЕДАКТИРОВАТЬ : Предложения из комментариев:

Ты можешь использовать

gcc -shared -o libhello.so -fPIC hello.c

сделать это за один шаг. - Джонатан Леффлер

Я также предлагаю добавить, -Wallчтобы получать все предупреждения и -gполучать отладочную информацию, к вашим gccкомандам. - Василий Старынкевич

dreamcrash
источник
1
Сначала вы должны выполнить gcc -c -fPIC blabla.c -o blabla.o, а затем указанную выше команду.
Dreamcrash
57
Или gcc -shared -o libhello.so -fPIC hello.cсделать это за один шаг.
Джонатан Леффлер
5
Я также предлагаю добавить, -Wallчтобы получать все предупреждения и -gполучать отладочную информацию, к вашим gccкомандам.
Василий Старынкевич
Спасибо за рекомендации, я добавил их в ответ
dreamcrash
3
.oФайл @sashoalm - это, по сути, объектный файл для исходного файла, прежде чем связать их вместе в конечный исполняемый файл. Поэтому при запуске gcc -o abc.c abc.oобъектный файл будет сгенерирован. Затем вы можете использовать этот abc.oфайл для создания .soфайла. Для создания такого количества файлов все, что вам нужно, это правильный код c, написанный в .cфайле. PS: Просто для устранения ваших сомнений в комментарии.