Comment créer une bibliothèque statique avec g++?
Quelqu'un peut-il me dire comment créer une bibliothèque statique à partir d'une .rpc et une .php fichier? Dois-je créer les .o et le .un? Je voudrais aussi savoir comment puis-je compiler une bibliothèque statique et l'utiliser dans d'autres .rpc code. J'ai header.cpp
, header.hpp .
je voudrais créer header.a
. Test de l'en-tête.un dans test.cpp
. J'utilise g++ pour compiler.
- Pouvez-vous s'il vous plaît accepter @NeilButterworth de réponse (ou un autre)?
Vous devez vous connecter pour publier un commentaire.
Créer un .o fichier:
ajouter ce fichier dans une bibliothèque, la création de la bibliothèque si nécessaire:
utilisation de la bibliothèque:
test
, quelque chose que vous ne devriez jamais faire. Sans l'option-o drapeau, un exécutable appelé.sera créé. Nous vieux programmeurs Unix, comme de cette façon.a.out
format donc, c'est très trompeur. Et pourquoi devriez-vous "jamais" créer un fichier exécutable appelétest
?test
est un système de commande. Mais depuis les programmes de test ne sont installés dans le système de répertoire bin et vous obligent à écrire./test
ce n'est pas tellement un problème pour moi non plus...-o
paramètre entièrement. Vous n'êtes pas lié par des constructions de ce que vous pourriez ont été [mal] enseignées à l'école, comme "vous devez écrireg++ A.cpp B.a -o A
".a.out
format, mais le nom reste pour des raisons d'héritage. (Et si vous êtes incapable d'utiliser un shell correctement, alors c'est votre problème; je ne sais comment faire pour exécuter un fichier exécutable à partir du répertoire courant.test
est just fine pour un nom d'exécutable, aussi longtemps que vous écrivez juste un test rapide extrait de cours.)a.out
format que vous ne semblez pas savoir ce que c'est. (b) Vous êtes en train de peindre votre opinion comme un fait, et beaucoup de professionnels très expérimentés ne partagent pas. (c) Vous avez soulevé. (d) je ne vais pas répondre à la suite de cette conversation.a.out
fichier, si c'est fait dans un.format de sortie ou d'un ELFE ou d'COFF. (Sur Windows, je pense que MinGW GCC sortiesa.exe
.) Je ne suis pas surpris Neil considère qu'il est hors de propos.a.out
format est obsolète. Simplement parce que c'est la valeur par défaut nom de fichier de sortie n'est pas une raison de le préférer.a.out
il a suggéré préférant. Il semble tout à fait explicite dans préférant pas à l'aide d'un nom commetest
.test
; je suis peut-être raté quelque chose, mais sa recommandation semble être en omettant les-o
paramètre, ce qui produit un fichier de sortie appeléa.out
.test
est quelque chose que j'ai appris à la dure à regret et je suis parfaitement capable d'utiliser un shell". C'est une mauvaise idée, et je l'ai vu mordre beaucoup d'autres qui sont "parfaitement capable d'utiliser un shell"..
dans votre$PATH
vous aurez certainement le regretter quelque chose à un moment ou à un autre..
dans votre chemin, mais plutôt l'inverse. Vous exécuteztest
, oubliant correctement exécuter en tant que./test
, et au lieu d'obtenircommand not found
il renvoie simplement sans erreur (ou de sortie).Vous pouvez créer un
.a
fichier à l'aide de laar
utilitaire, comme suit:lib
est un répertoire qui contient tous vos bibliothèques. il est de bonne pratique pour organiser votre code de cette façon et de séparer le code et les fichiers de l'objet. Avoir tout dans un seul répertoire général semble laid. La ligne ci-dessus créelibHeader.a
dans le répertoirelib
. Donc, dans votre répertoire courant, n':Puis exécuter le dessus
ar
de commande.Lors de la liaison de toutes les bibliothèques, vous pouvez le faire comme ceci:
La
-L
drapeau obtiendrezg++
pour ajouter lelib/
répertoire du chemin. De cette façon,g++
sait ce répertoire à rechercher lors de la recherche pourlibHeader
.-llibHeader
drapeaux de la bibliothèque de lien.où test.o est créé comme suit:
-lHeader
au lieu de-llibHeader
?Oui.
Créer la .o (comme d'habitude):
De créer l'archive:
Test:
Noter qu'il semble un peu inutile de faire une archive avec un seul module de. Vous pourriez tout aussi bien avoir écrit:
Encore, je vais vous donner le bénéfice du doute que votre cas est un peu plus complexe, avec plus de modules.
Espérons que cette aide!
ranlib
qui en GNU signifie simplementar s
.