¿Cómo crear una biblioteca estática con g ++?

101

¿Alguien puede decirme cómo crear una biblioteca estática a partir de un archivo .cpp y .hpp? ¿Necesito crear el .o y el .a? También me gustaría saber cómo puedo compilar una biblioteca estática y usarla en otro código .cpp. Tengo header.cpp, header.hpp .me gustaría crear header.a. Pruebe el encabezado. A entest.cpp . A . Estoy usando g ++ para compilar.

linuxx
fuente
3
¿Puede aceptar la respuesta de @ NeilButterworth (u otra)?
einpoklum

Respuestas:

110

Cree un archivo .o:

g++ -c header.cpp

agregue este archivo a una biblioteca, creando una biblioteca si es necesario:

ar rvs header.a header.o

usar biblioteca:

g++ main.cpp header.a

fuente
3
g ++ test.cpp header.a -o test, ¿no?
linuxx
11
@unapersson: ¿Por qué? El ejecutable no está en a.outformato, por lo que es muy engañoso. ¿Y por qué debería "nunca" crear un ejecutable llamado test?
Lightness Races in Orbit
5
@Tomalak Geret'kal: Supongo que esto tiene que ver con el hecho de que testes un comando del sistema. Pero dado que los programas de prueba generalmente nunca se instalan en el directorio bin del sistema y requieren que usted escriba, ./testtampoco es un gran problema para mí ...
ereOn
10
@unapersson: No. Estoy diciendo exactamente lo que dije. Los ejecutables ya no se producen en a.outformato, pero el nombre permanece por motivos heredados. (Y si no puede usar un shell correctamente, entonces ese es su problema; yo sé cómo ejecutar un ejecutable desde el directorio actual. testEstá bien para un nombre de ejecutable, siempre y cuando esté escribiendo solo una prueba rápida fragmento, por supuesto.)
Lightness Races in Orbit
4
Nombrar un ejecutable testes algo de lo que he aprendido a arrepentirme y soy "perfectamente capaz de usar un shell". Es una mala idea, y lo he visto morder a muchos otros que son "perfectamente capaces de usar un caparazón".
Presidente James K. Polk
46

Puede crear un .aarchivo usando la arutilidad, así:

ar crf lib/libHeader.a header.o

libes un directorio que contiene todas sus bibliotecas. Es una buena práctica organizar su código de esta manera y separar el código y los archivos de objeto. Tener todo en un directorio generalmente se ve feo. La línea anterior crea libHeader.aen el directorio lib. Entonces, en su directorio actual, haga:

mkdir lib

Luego ejecute el arcomando anterior .

Al vincular todas las bibliotecas, puede hacerlo así:

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

La -Lbandera podrá g++agregar el lib/directorio a la ruta. De esta manera, g++sabe en qué directorio buscar libHeader. -llibHeadermarca la biblioteca específica para vincular.

donde test.o se crea así:

g++ -c test.cpp -o test.o 
Sriram
fuente
2
y ¿qué pasa con lib / libHeader.a? ar rcs ... ¿no es mejor que ar crf?
linuxx
1
@linuxx: main.o será el archivo de objeto que cree a partir de main.cc
Sriram
@linuxx: los indicadores exactos que usa con la utilidad ar son su decisión en función de sus requisitos. Sería una buena idea buscar en las páginas de manual de ar.
Sriram
¿Cómo probar la biblioteca usando test.cpp?
linuxx
19
¿No sería en -lHeaderlugar de -llibHeader?
Dolanor
30

¿Alguien puede decirme cómo crear una biblioteca estática a partir de un archivo .cpp y .hpp? ¿Necesito crear el .o y el .a?

Si.

Cree el .o (como de costumbre):

g++ -c header.cpp

Crea el archivo :

ar rvs header.a header.o

Prueba :

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

Tenga en cuenta que parece un poco inútil hacer un archivo con un solo módulo. Con la misma facilidad podrías haber escrito:

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

Aún así, le daré el beneficio de la duda de que su caso de uso real es un poco más complejo, con más módulos.

¡Espero que esto ayude!

Carreras de ligereza en órbita
fuente
1
¿Cómo incluimos múltiples módulos?
Sidhin S Thomas
2
¡Buena! A veces vemos lo ranlibque en GNU simplemente significa ar s.
Viet