Comment créer une bibliothèque statique avec g ++?

101

Quelqu'un peut-il me dire comment créer une bibliothèque statique à partir d'un fichier .cpp et d'un fichier .hpp? Dois-je créer le .o et le .a? J'aimerais également savoir comment puis-je compiler une bibliothèque statique et l'utiliser dans un autre code .cpp. J'ai header.cpp, header.hpp .je voudrais créer header.a. Testez l'en-tête test.cpp. J'utilise g ++ pour la compilation.

linuxx
la source
3
Pouvez-vous s'il vous plaît accepter la réponse de @ NeilButterworth (ou une autre)?
einpoklum

Réponses:

111

Créez un fichier .o:

g++ -c header.cpp

ajoutez ce fichier à une bibliothèque, en créant une bibliothèque si nécessaire:

ar rvs header.a header.o

utiliser la bibliothèque:

g++ main.cpp header.a

la source
3
g ++ test.cpp header.a -o test, non?
linuxx
11
@unapersson: Pourquoi? L'exécutable n'est pas au a.outformat, c'est donc très trompeur. Et pourquoi devriez-vous "jamais" créer un exécutable appelé test?
Courses de légèreté en orbite
5
@Tomalak Geret'kal: Je suppose que cela a à voir avec le fait qu'il tests'agit d'une commande système. Mais comme les programmes de test ne sont généralement jamais installés dans le répertoire bin système et vous obligent à écrire, ./testce n'est pas vraiment un problème pour moi non plus ...
ereOn
10
@unapersson: Non. Je dis exactement ce que j'ai dit. Les exécutables ne sont plus produits au a.outformat, mais le nom reste pour des raisons d'héritage. (Et si vous êtes incapable d'utiliser correctement un shell, c'est votre problème; pour ma part, je sais comment exécuter un exécutable à partir du répertoire actuel. testEst très bien pour un nom d'exécutable, tant que vous écrivez juste un test rapide extrait de code bien sûr.)
Courses de légèreté en orbite
4
Nommer un exécutable testest quelque chose que j'ai appris à regretter et je suis "parfaitement capable d'utiliser un shell". C'est une mauvaise idée, et je l'ai vu en mordre beaucoup d'autres qui sont "parfaitement capables d'utiliser un shell".
Président James K. Polk
47

Vous pouvez créer un .afichier à l'aide de l' arutilitaire, comme ceci:

ar crf lib/libHeader.a header.o

libest un répertoire qui contient toutes vos bibliothèques. il est recommandé d'organiser votre code de cette façon et de séparer le code et les fichiers objets. Tout avoir dans un seul répertoire semble généralement moche. La ligne ci-dessus crée libHeader.adans le répertoire lib. Donc, dans votre répertoire actuel, faites:

mkdir lib

Exécutez ensuite la arcommande ci-dessus .

Lors de la liaison de toutes les bibliothèques, vous pouvez le faire comme ceci:

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

Le -Ldrapeau g++ajoutera le lib/répertoire au chemin. De cette façon, g++sait quel répertoire rechercher lors de la recherche libHeader. -llibHeadermarque la bibliothèque spécifique à lier.

où test.o est créé comme ceci:

g++ -c test.cpp -o test.o 
Sriram
la source
2
et qu'est-ce que lib / libHeader.a? ar rcs ... n'est-ce pas mieux que ar crf?
linuxx
1
@linuxx: main.o sera le fichier objet que vous créez à partir de main.cc
Sriram
@linuxx: les indicateurs exacts que vous utilisez avec l'utilitaire ar sont votre décision en fonction de vos besoins. Consulter les pages de manuel pour ar serait une bonne idée.
Sriram
comment tester la bibliothèque en utilisant test.cpp?
linuxx
19
Ne serait-ce pas à la -lHeaderplace de -llibHeader?
Dolanor
30

Quelqu'un peut-il me dire comment créer une bibliothèque statique à partir d'un fichier .cpp et d'un fichier .hpp? Dois-je créer le .o et le .a?

Oui.

Créez le .o (comme d'habitude):

g++ -c header.cpp

Créez l'archive :

ar rvs header.a header.o

Test :

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

Notez qu'il semble un peu inutile de créer une archive avec un seul module. Vous auriez pu tout aussi bien écrire:

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

Néanmoins, je vais vous donner l'avantage du doute que votre cas d'utilisation réel est un peu plus complexe, avec plus de modules.

J'espère que cela t'aides!

Courses de légèreté en orbite
la source
1
Comment inclure plusieurs modules?
Sidhin S Thomas
2
Bon! Parfois, nous voyons ranlibce que signifie simplement dans GNU ar s.
Viet