2009-03-01 14 views
16

Ребята, не могли бы вы описать несколько вещей о строительных блоках C++ в unix.Создание проекта из Makefile в статические/динамические библиотеки в UNIX

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

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

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

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

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

Благодаря

ответ

15

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

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

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

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

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

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

10

Голые кости 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) 

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

+0

Что такое флаг -c в НКУ. Как насчет заголовочного файла? – 2009-03-01 00:29:58

+0

также, $ <означает, все файлы cpp? зачем вам нужен этот случай .cpp.o: g ++ -c $ (CFLAGS) $ <он не может быть вызван нигде? Спасибо – 2009-03-01 00:35:59

+0

-c означает компиляцию, но не ссылку. $ <- имя файла без расширения. Проверьте страницы man для gcc, make. Файлы заголовков не имеют места в Makefile, если они не являются зависимыми. –

2

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

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

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

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

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

0

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

0

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

+1

Это очень хорошая книга, но я предпочитаю что-то в сочетании с make-файлами. – 2009-03-01 17:04:24

Смежные вопросы