Як створити статичну бібліотеку з g ++?


101

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


3
Чи можете ви прийняти відповідь @ NeilButterworth (чи іншу)?
einpoklum

Відповіді:


110

Створіть .o файл:

g++ -c header.cpp

додайте цей файл до бібліотеки, створивши при необхідності бібліотеку:

ar rvs header.a header.o

використовувати бібліотеку:

g++ main.cpp header.a

3
g ++ test.cpp header.a - тест, ні?
linuxx

11
@unapersson: Чому? Виконавчий файл не у a.outформаті, тому це дуже вводить в оману. І чому ви повинні "ніколи" не створювати виконуваний файл, який називається test?
Гонки легкості по орбіті

5
@Tomalak Geret'kal: Я думаю, це пов'язане з тим, що testце системна команда. Але оскільки тестові програми зазвичай ніколи не встановлюються в каталозі системних бін і вимагають, щоб ви це написали, ./testце не так вже й велика проблема для мене ...
ereOn

10
@unapersson: Ні. Я кажу саме те, що я сказав. Виконавчі файли більше не випускаються у a.outформаті, але назва залишається із застарілих причин. (І якщо ви не в змозі правильно використовувати оболонку, то це ваша проблема; я, напевно, знаю, як запустити виконуваний файл з поточного каталогу. testЦе просто чудово для виконавчого імені, якщо ви пишете лише швидкий тест фрагмент звісно.)
Гонки легкості в орбіті

4
Іменування виконуваного файлу test- це те, про що я навчився важко шкодувати, і я "чудово вмію використовувати оболонку". Це погана ідея, і я бачив, як вона кусає багатьох інших, які "прекрасно здатні використовувати оболонку".
президент Джеймс К. Полк

46

Ви можете створити .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
Sriram

@ linuxx: точні прапори, які ви використовуєте з утилітою ar, - це ваше рішення, виходячи з ваших вимог. Подивитись сторінки чоловіків на ар було б хорошою ідеєю.
Шрірам

як протестувати бібліотеку за допомогою test.cpp?
linuxx

19
Чи не було б -lHeaderзамість цього -llibHeader?
Доланор

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
Як ми включаємо кілька модулів?
Сидхін Томас

2
Хороший! Іноді ми бачимо, ranlibщо в GNU просто означає ar s.
В’єт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.