Как создать статическую библиотеку с g ++?

101

Может кто-нибудь сказать мне, как создать статическую библиотеку из файлов .cpp и .hpp? Нужно ли мне создавать .o и .a? Я также хотел бы знать, как я могу скомпилировать статическую библиотеку и использовать ее в другом коде .cpp. Есть header.cpp, header.hpp .хочу творить header.a. Протестируйте header.a в test.cpp. Я использую g ++ для компиляции.

linuxx
источник
3
Не могли бы вы принять ответ @ NeilButterworth (или другой)?
einpoklum

Ответы:

111

Создайте файл .o:

g++ -c header.cpp

добавить этот файл в библиотеку, создав библиотеку при необходимости:

ar rvs header.a header.o

использовать библиотеку:

g++ main.cpp header.a

источник
3
g ++ test.cpp header.a -o тест, нет?
linuxx
11
@unapersson: Почему? Исполняемый файл не в a.outформате, поэтому это вводит в заблуждение. И почему вам «никогда» не следует создавать исполняемый файл с именем test?
Гонки легкости на орбите
5
@Tomalak Geret'kal: Думаю, это связано с тем, что testэто системная команда. Но поскольку тестовые программы обычно никогда не устанавливаются в системный каталог bin и требуют от вас записи, ./testдля меня это тоже не такая уж проблема ...
ereOn
10
@unapersson: Нет. Я говорю именно то, что сказал. Исполняемые файлы больше не производятся в a.outформате, но имя остается по устаревшим причинам. (И если вы не можете правильно использовать оболочку, то это ваша проблема; я, например, знаю, как запустить исполняемый файл из текущего каталога. testЭто нормально для имени исполняемого файла, если вы пишете просто быстрый тест фрагмент конечно.)
Lightness Races in Orbit
4
Присвоение имени исполняемому файлу test- это то, о чем я на собственном горьком опыте сожалею, и я «прекрасно умею использовать оболочку». Это плохая идея, и я видел, как она укусила многих, которые «прекрасно умеют пользоваться скорлупой».
Президент Джеймс К. Полк
47

Вы можете создать .aфайл с помощью arутилиты, например:

ar crf lib/libHeader.a header.o

libэто каталог, содержащий все ваши библиотеки. Это хорошая практика - организовать свой код таким образом и разделить код и объектные файлы. Размещение всего в одном каталоге обычно выглядит некрасиво. Вышеупомянутая строка создается libHeader.aв каталоге lib. Итак, в вашем текущем каталоге выполните:

mkdir lib

Затем запустите указанную выше arкоманду.

При компоновке всех библиотек это можно сделать так:

g++ test.o -L./lib -lHeader -o test  

-LФлаг получит , g++чтобы добавить lib/каталог в пути. Таким образом, он g++знает, в каком каталоге искать libHeader. -llibHeaderотмечает конкретную библиотеку для связывания.

где test.o создается так:

g++ -c test.cpp -o test.o 
Шрирам
источник
2
а что с lib / libHeader.a? ar rcs ... разве это не лучше, чем ar crf?
linuxx
1
@linuxx: main.o будет объектным файлом, который вы создадите из main.cc
Шрирам
@linuxx: точные флаги, которые вы используете с утилитой ar, - это ваше решение, основанное на ваших требованиях. Было бы неплохо поискать справочные страницы для ar.
Шрирам
как протестировать библиотеку с помощью test.cpp?
linuxx
19
Не было бы -lHeaderвместо -llibHeader?
Dolanor
30

Может кто-нибудь сказать мне, как создать статическую библиотеку из файлов .cpp и .hpp? Нужно ли мне создавать .o и .a?

Да.

Создайте .o (как обычно):

g++ -c header.cpp

Создайте архив :

ar rvs header.a header.o

Тест :

g++ test.cpp header.a -o executable_name

Заметьте, что создание архива с одним модулем кажется бессмысленным. Вы могли бы так же легко написать:

g++ test.cpp header.cpp -o executable_name

Тем не менее, я дам вам возможность сомневаться в том, что ваш реальный вариант использования немного сложнее, с большим количеством модулей.

Надеюсь это поможет!

Гонки легкости на орбите
источник
1
Как включить несколько модулей?
Sidhin S Thomas
2
Хороший! Иногда мы видим, ranlibчто в GNU просто означает ar s.
Viet