Создание проекта, от Makefile до статических / динамических библиотек в UNIX - PullRequest
17 голосов
/ 01 марта 2009

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

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

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

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

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

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

Спасибо

Ответы [ 6 ]

15 голосов
/ 01 марта 2009

Статические библиотеки обычно архивируются с помощью команды 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.

11 голосов
/ 01 марта 2009

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)

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)

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

2 голосов
/ 01 марта 2009

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

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

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

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

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

0 голосов
/ 12 апреля 2010

Вы также можете посмотреть на это: http://www.faqs.org/docs/Linux-HOWTO/Program-Library-HOWTO.html

0 голосов
/ 01 марта 2009

Когда я изучал программирование на Linux, Advanced Linux Programming мне очень помог. Вы можете проверить раздел «Написание и использование библиотек» в этом pdf . Это объясняет довольно много о библиотеках в Linux.

0 голосов
/ 01 марта 2009

Поскольку вы ссылаетесь на gcc, я предполагаю, что вы используете GNU Make. Лучшая документация, которую я нашел для этого, - официальное руководство , которое охватывает все, что вам нужно знать, в понятных терминах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...