Создание проекта из Makefile в статические/динамические библиотеки в UNIX
Ребята, вы бы описали несколько вещей о строительных блоках С++, в unix.
Я хочу создать приложение, которое ссылается на статические библиотеки и динамические библиотеки (.so).
Вопрос 1: Как создать статическую библиотеку с помощью gcc/g++? Как мне создать ссылку на приложение.
Вопрос 2: Как указать его в make файле, ссылаясь на статические и динамические библиотеки, предполагая, что обе библиотеки имеют файлы заголовков
Резюме: Я много лет использую make файлы и библиотеки, написанные кем-то другим. Таким образом, каждый раз, когда я его модифицировал, я просто обрезал и вставлял вещи, не понимая этого. Теперь я хочу спуститься на землю и понять процесс построения/связывания/создания Makfile в глубину.
Что такое хорошая книга, описывающая эти понятия в интимных подробностях?
Спасибо
Ответы
Ответ 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),
но они не являются беспроблемными.
Ответ 4
Поскольку вы ссылаетесь на gcc, я предполагаю, что вы используете GNU Make. Лучшая документация, которую я нашел для этого, - это официальное руководство которое охватывает все, что вам нужно знать, в понятных для понимания условиях.
Ответ 5
Когда я узнал о программировании Linux, мне помогло "Расширенное программирование Linux" . Вы можете проверить раздел "Запись и использование библиотек" в этот pdf. Это немного объясняет библиотеки в Linux.
Ответ 6
вы можете также взглянуть на это: http://www.faqs.org/docs/Linux-HOWTO/Program-Library-HOWTO.html