Come creare una libreria statica con g ++?


101

Qualcuno può dirmi come creare una libreria statica da un file .cpp e .hpp? Devo creare il .o e il .a? Vorrei anche sapere come posso compilare una libreria statica e usarla in un altro codice .cpp. Ho header.cpp, header.hpp .vorrei creare header.a. Testa l'intestazione test.cpp. Sto usando g ++ per la compilazione.


3
Puoi accettare la risposta di @ NeilButterworth (o un'altra)?
einpoklum

Risposte:


110

Crea un file .o:

g++ -c header.cpp

aggiungi questo file a una libreria, creando libreria se necessario:

ar rvs header.a header.o

usa la libreria:

g++ main.cpp header.a

3
g ++ test.cpp header.a -o test, no?
linuxx

11
@unapersson: perché? L'eseguibile non è in a.outformato, quindi questo è altamente fuorviante. E perché non dovresti "mai" creare un eseguibile chiamato test?
Gare di leggerezza in orbita

5
@ Tomalak Geret'kal: Immagino che questo abbia a che fare con il fatto che testè un comando di sistema. Ma dal momento che i programmi di prova di solito non vengono mai installati nella directory bin di sistema e richiedono di scrivere, ./testnon è un grosso problema neanche per me ...
ereIl

10
@unapersson: No. Sto dicendo esattamente quello che ho detto. Gli eseguibili non vengono più prodotti in a.outformato, ma il nome rimane per motivi legacy. (E se siete in grado di utilizzare una shell correttamente allora questo è il vostro problema,. Io per primo sanno come gestire un eseguibile dalla directory corrente testè bene per un nome eseguibile, a patto che si sta scrivendo solo un test rapido snippet ovviamente.)
Gare di leggerezza in orbita

4
Denominare un eseguibile testè qualcosa di cui ho imparato a mie spese e che sono "perfettamente in grado di usare una shell". È una cattiva idea, e ho visto mordere molti altri che sono "perfettamente in grado di usare un guscio".
Presidente James K. Polk

46

Puoi creare un .afile usando l' arutilità, in questo modo:

ar crf lib/libHeader.a header.o

libè una directory che contiene tutte le tue librerie. è buona norma organizzare il codice in questo modo e separare il codice dai file oggetto. Avere tutto in una directory generalmente sembra brutto. La riga sopra crealibHeader.a nella directory lib. Quindi, nella tua directory corrente, fai:

mkdir lib

Quindi esegui il arcomando precedente .

Quando colleghi tutte le librerie, puoi farlo in questo modo:

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

Il -Lflag g++aggiungerà la lib/directory al percorso. Per di qua,g++ sa quale directory cercare durante la ricerca libHeader. -llibHeadercontrassegna la libreria specifica da collegare.

dove test.o viene creato in questo modo:

g++ -c test.cpp -o test.o 

2
e cosa c'è con lib / libHeader.a? ar rcs ... non è meglio di ar crf?
linuxx

1
@linuxx: main.o sarà il file oggetto che creerai da main.cc
Sriram

@linuxx: i flag esatti che usi con l'utility ar dipendono dalle tue esigenze. Cercare le pagine man per ar sarebbe una buona idea.
Sriram

come testare la libreria utilizzando test.cpp?
linuxx

19
Non sarebbe -lHeaderinvece di -llibHeader?
Dolanor

30

Qualcuno può dirmi come creare una libreria statica da un file .cpp e .hpp? Devo creare il .o e il .a?

Sì.

Crea il .o (come di consueto):

g++ -c header.cpp

Crea l'archivio :

ar rvs header.a header.o

Prova :

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

Nota che sembra un po 'inutile creare un archivio con un solo modulo al suo interno. Avresti potuto scrivere altrettanto facilmente:

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

Tuttavia, ti darò il vantaggio del dubbio che il tuo caso d'uso effettivo sia un po 'più complesso, con più moduli.

Spero che questo ti aiuti!


1
Come includiamo più moduli?
Sidhin S Thomas

2
Buono! A volte vediamo ranlibche in GNU significa semplicemente ar s.
Viet
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.