Подтвердить что ты не робот

Создание проекта из Makefile в статические/динамические библиотеки в UNIX

Ребята, вы бы описали несколько вещей о строительных блоках С++, в unix.

Я хочу создать приложение, которое ссылается на статические библиотеки и динамические библиотеки (.so).

Вопрос 1: Как создать статическую библиотеку с помощью gcc/g++? Как мне создать ссылку на приложение.

Вопрос 2: Как указать его в make файле, ссылаясь на статические и динамические библиотеки, предполагая, что обе библиотеки имеют файлы заголовков

Резюме: Я много лет использую make файлы и библиотеки, написанные кем-то другим. Таким образом, каждый раз, когда я его модифицировал, я просто обрезал и вставлял вещи, не понимая этого. Теперь я хочу спуститься на землю и понять процесс построения/связывания/создания Makfile в глубину.

Что такое хорошая книга, описывающая эти понятия в интимных подробностях?

Спасибо

4b9b3361

Ответ 1

Статические библиотеки обычно архивируются с помощью команды ar. Когда вы создадите все объектные файлы (желательно с помощью переключателя -fPIC на GCC), вы можете запустить ar следующим образом:

ar -rs archivename.a list.o of.o objects.o

Страница man описывает параметры.

Динамические библиотеки обычно строятся с ключом -shared на gcc или ld, а имя выходного файла с расширением .so.

Autotools обрабатывает это с помощью программы libtool. Я не знаком с его использованием.

Связывание с этими библиотеками может быть сделано либо путем перечисления библиотек с помощью переключателя -l (ell) (например, -lX для ссылки на libX.so), либо путем непосредственного указания их на абсолютные пути (например, добавление /usr/lib/libX.so к вашей команде). Статические библиотеки связаны путем указания -static до -l или соответствующего абсолютного пути к архиву .a.

Ответ 2

Bare bones Makefile для создания статической библиотеки, состоящей из кода в foo.cpp, bar.cpp:

PROJECT = library.a
OBJECTS = foo.o bar.o
CFLAGS  = -Wall -pedantic

all: $(PROJECT)

.cpp.o:
        g++ -c $(CFLAGS) $<

$(PROJECT): $(OBJECTS)
        libtool -o $(PROJECT) -static $(OBJECTS)

Bare bones Makefile для приложения baz.cpp, что статические ссылки на library.a:

PROJECT = baz
CFLAGS  = -Wall -pedantic
OBJECTS = baz.o

all: $(PROJECT)

.cpp.o:
        g++ -c $(CFLAGS) $<

$(PROJECT): $(OBJECTS) library.a
        g++ $(OBJECTS) -L. -llibrary -o $(PROJECT)

Динамическая библиотека слева, ахм, как упражнение для читателя.

Ответ 3

Ответ 1: Чтобы создать статическую библиотеку из исходных файлов foo.c и bar.c, выполните следующие действия:

gcc -c foo.c
gcc -c bar.c
ar rc mylibrary.a foo.o bar.o

Для получения дополнительной информации об этом читайте руководство GCC чтобы узнать, как использовать компилятор, и компоновщик через компилятор. руководство binutils должно также быть полезным.

Ответ 2: GNU Make manual довольно хорошо. Чтобы действительно узнать о библиотеках и как они работают, прочитайте Linkers and Loaders книга Джона Р. Левина.

Статические библиотеки довольно просты, но общие библиотеки могут быть очень волосатыми, в зависимости от на платформе и объем портативности, который вы хотите и нуждаетесь. В качестве примера некоторые системы статические и разделяемые библиотеки должны быть скомпилированы с различными параметрами работать должным образом (один должен и не должен компилироваться с независимым положением код). Были разработаны все системы коммунальных услуг, чтобы сделать это проще (libtool), но они не являются беспроблемными.