Может кто-нибудь сказать мне, как создать статическую библиотеку из файлов .cpp и .hpp? Нужно ли мне создавать .o и .a? Я также хотел бы знать, как я могу скомпилировать статическую библиотеку и использовать ее в другом коде .cpp. Есть header.cpp
, header.hpp .
хочу творить header.a
. Протестируйте header.a в test.cpp
. Я использую g ++ для компиляции.
c++
gcc
compiler-construction
g++
linuxx
источник
источник
Ответы:
Создайте файл .o:
добавить этот файл в библиотеку, создав библиотеку при необходимости:
использовать библиотеку:
источник
a.out
формате, поэтому это вводит в заблуждение. И почему вам «никогда» не следует создавать исполняемый файл с именемtest
?test
это системная команда. Но поскольку тестовые программы обычно никогда не устанавливаются в системный каталог bin и требуют от вас записи,./test
для меня это тоже не такая уж проблема ...a.out
формате, но имя остается по устаревшим причинам. (И если вы не можете правильно использовать оболочку, то это ваша проблема; я, например, знаю, как запустить исполняемый файл из текущего каталога.test
Это нормально для имени исполняемого файла, если вы пишете просто быстрый тест фрагмент конечно.)test
- это то, о чем я на собственном горьком опыте сожалею, и я «прекрасно умею использовать оболочку». Это плохая идея, и я видел, как она укусила многих, которые «прекрасно умеют пользоваться скорлупой».Вы можете создать
.a
файл с помощьюar
утилиты, например:lib
это каталог, содержащий все ваши библиотеки. Это хорошая практика - организовать свой код таким образом и разделить код и объектные файлы. Размещение всего в одном каталоге обычно выглядит некрасиво. Вышеупомянутая строка создаетсяlibHeader.a
в каталогеlib
. Итак, в вашем текущем каталоге выполните:Затем запустите указанную выше
ar
команду.При компоновке всех библиотек это можно сделать так:
-L
Флаг получит ,g++
чтобы добавитьlib/
каталог в пути. Таким образом, онg++
знает, в каком каталоге искатьlibHeader
.-llibHeader
отмечает конкретную библиотеку для связывания.где test.o создается так:
источник
-lHeader
вместо-llibHeader
?Да.
Создайте .o (как обычно):
Создайте архив :
Тест :
Заметьте, что создание архива с одним модулем кажется бессмысленным. Вы могли бы так же легко написать:
Тем не менее, я дам вам возможность сомневаться в том, что ваш реальный вариант использования немного сложнее, с большим количеством модулей.
Надеюсь это поможет!
источник
ranlib
что в GNU просто означаетar s
.