Comment puis-je créer une bibliothèque?
Disons que j'ai 10 *.hpp et *.rpc fichiers que j'ai besoin de compiler un code. Je sais que j'ai besoin de ces mêmes fichiers pour de nombreux codes différents. Puis-je créer un "package" avec les fichiers qui me permettrait d'écrire tout simplement
#include<mypackage>
au lieu de
#include"file1.hpp"
#include"file2.hpp"
...
#include"file10.hpp"
Je n'aurais pas besoin d'écrire un makefile à chaque fois que j'ai besoin de ce "package".
Pour être plus précis, j'utilise linux.
OriginalL'auteur PinkFloyd | 2013-05-22
Vous devez vous connecter pour publier un commentaire.
Une collection de RPC sources (H fichiers et les fichiers CPP) peuvent être regroupées dans une "bibliothèque", qui peuvent ensuite être utilisés dans d'autres programmes et bibliothèques. Les détails de cette procédure sont à la plate - forme et des outils spécifiques, donc je vous laisse le soin de découvrir les détails. Cependant, je vais vous donner quelques liens que vous pouvez avoir une lecture de:
La création d'un partagées et bibliothèque statique avec le compilateur gnu [gcc]
Procédure pas à pas: Création et Utilisation d'une Bibliothèque de liens Dynamiques (C++)
Les bibliothèques peuvent être séparés en deux types: le code source des bibliothèques et des bibliothèques binaires. Il peut aussi y avoir des hybrides de ces deux types -- une bibliothèque peut être à la fois une source et binaire de la bibliothèque. Le code Source des bibliothèques ne sont que cela: une collection de code distribué en tant que juste le code source; en général, fichiers d'en-tête. La plupart des bibliothèques Boost sont de ce type. Les bibliothèques binaires sont compilées dans un package d'exécution-chargeable par un programme client.
Même dans le cas de bibliothèques binaires (et, évidemment, dans le cas des bibliothèques de source), un fichier d'en-tête (ou plusieurs fichiers d'en-tête) doit être fournie à l'utilisateur de la bibliothèque. Elle indique au compilateur du programme client quelles sont les fonctions etc à rechercher dans la bibliothèque. Ce qui est souvent fait par la bibliothèque des écrivains est un maître de fichier d'en-tête est composé avec les déclarations de tout ce qui est exporté par la bibliothèque, et le client sera de
#include
cet en-tête. Plus tard, dans le cas de bibliothèques binaires, le client programme "lien" à la bibliothèque, et cela résout tous les noms mentionnés dans l'en-tête de fichier exécutable adresses.Lors de la rédaction du côté client, le fichier d'en-tête, à maintenir la complexité de l'esprit. Il peut y avoir de nombreux cas où certains de vos clients ne souhaitez utiliser que quelques parties de votre bibliothèque. Si vous composez un maître de fichier d'en-tête qui comprend tout à partir de votre bibliothèque, vos clients les temps de compilation sera inutilement augmenté.
Une commune de la façon de traiter ce problème est d'offrir à chacun de fichiers d'en-tête pour la corrélation des parties de votre bibliothèque. Si vous pensez à tous de Stimuler une seule bibliothèque, puis Boost est un exemple. Boost est une énorme bibliothèque, mais si tout ce que vous voulez, c'est la regex fonctionnalité, vous ne pouvez
#include
la regex liées à l'en-tête(s) pour obtenir cette fonctionnalité. Vous n'avez pas à inclure tous de Boost si tout ce que vous voulez, c'est la regex choses.À la fois sous Windows et Linux, les bibliothèques binaires peuvent être subdivisés en deux types: dynamique et statique. Dans le cas des bibliothèques statiques, le code de la bibliothèque est en fait "importés" (faute d'un meilleur terme) dans le fichier exécutable du programme client. Une bibliothèque statique est distribué par vous, mais ce n'est que de besoin par le client lors de l'étape de la compilation. C'est pratique si vous ne voulez pas à la force de votre client d'avoir à distribuer des fichiers supplémentaires avec leur programme. Il aide également à éviter Dépendance De L'Enfer. Une bibliothèque Dynamique, d'autre part, n'est pas "importés" dans le programme client directement, acheter chargés dynamiquement par le programme client lorsqu'il exécute. Cela réduit la taille du programme client et peut-être le disque de l'empreinte dans le cas où plusieurs programmes utilisent la même bibliothèque dynamique, mais la bibliothèque binaire doit être distribué & installé avec le programme client.
merci, très utile
Que faire si j'ai une bibliothèque de seul modèle de fonctions? Ils ne peuvent pas être traitées comme des fonctions, les définitions doivent être dans le fichier d'en-tête. Donc, si je distribue le binaire statique de la bibliothèque, j'avais essentiellement par l'envoi de loin le code source lui-même... Est-il un moyen de cacher le code source du modèle de fonctions de la part du client?
OriginalL'auteur John Dibling
En supposant que votre "fichier1.hpp" et "fichier2.hpp", etc. sont étroitement liés et (presque) toujours utilisés ensemble, puis de faire un "mypacakge.h" qui contient le comprend d'autres composantes est une bonne idée (il n'a pas en soi d'en faire une bibliothèque - c'est un processus totalement différent).
Si elles ne sont PAS étroitement liés et/ou utilisés ensemble, alors vous ne devriez pas avoir un "mega include", parce qu'il traîne dans un tas de choses qui ne sont pas nécessaires.
Pour faire une bibliothèque implique la construction de votre code une fois, et de générer un .lib ou d'un fichier de bibliothèque partagée (.dll ou .si le fichier). Les étapes exactes pour ce faire dépend de ce que vous utilisez, et c'est un peu trop compliqué pour moi de l'expliquer ici.
Edit: Pour de plus amples explications: l'Ensemble de la bibliothèque C++ est en fait un fichier de bibliothèque ou la bibliothèque partagée fichier [avec un certain nombre de fichiers d'en-tête qui contient le code et les déclarations nécessaires pour utiliser le code dans la bibliothèque]. Mais vous comprennent
<iostream>
et<vector>
séparément, il serait devenu assez horrible pour inclure toutes les informations de toutes les différentes de la bibliothèque C++ en-têtes dans un<allcpplibrary>
, même si c'est beaucoup moins tapant impliqués. Il est divisé en sections que faire une chose par headerfile. Ainsi, vous obtenez un "complet" ensemble à partir d'un fichier d'en-tête, mais pas trop d'autres choses que vous n'avez pas réellement besoin.OriginalL'auteur Mats Petersson
Si un client a besoin de tous les dix-têtes de réellement faire usage de votre "package" (bibliothèque), c'est assez mauvais design d'interface.
Si un client a besoin seulement certains en-têtes, selon les éléments de votre bibliothèque sont utilisés, permettent au client d'inclure les en-têtes appropriés, ainsi qu'un ensemble minimal de identificateurs sont introduits. Cela permet de donner une portée, la modularisation et les temps de compilation.
Si tout le reste échoue, vous pouvez faire une "interface de l'en-tête" pour l'usage externe, ce qui est différent de ceux que vous utilisez en interne pour, en fait, la compilation de votre bibliothèque. Ce serait celle qui est installée, et se compose de la nécessité de contenu à partir d'autres en-têtes. (Je ne pense pas que vous auriez besoin tout de chaque d'en-tête dans votre lib.)
Je voudrais décourager Salgar de la solution. Vous soit ont des en-têtes, ou monolithique. Fournir à des en-têtes de plus une centrale de simplement les autres, me paraît assez mauvaise mise en page.
Ce que je fais pas comprendre, c'est inhowfar Makefiles jouer dans cette. L'en-tête dépendances devraient être résolus automatiquement par votre Makefile /système de build, c'est à dire qu'il ne devrait pas question ici comment vos fichiers d'en-tête sont layed dehors.
Je suis sérieux, confus. Je ne suis pas sûr que je voudrais demander à ce que votre Makefiles...
OriginalL'auteur DevSolar
Oui et non.
Vous pouvez écrire une inclusion-tous les en-tête de sorte que
#include "myLib.h"
est suffisante, parce que vous d'inclure tous ces en-têtes par le biais de l'en-tête unique. Toutefois, cela ne signifie pas que le single est assez pour avoir le contenu de la 10 '."cpp" les fichiers liés à votre projet auto-magiquement. Vous aurez à les compiler dans une bibliothèque et lien unique de la bibliothèque (au lieu de tous les fichiers de l'objet) pour les projets qui utilisent des "myLib.h". Bibliothèque fichiers binaires venir comme statique et dynamique, les bibliothèques, les fichiers sont généralement nommé.lib
et.dll
(windows) et.a
et.so
(linux) statique et dynamique des bibliothèques, respectivement.Comment créer et lier de telles bibliothèques dépend de votre système de construction, vous pouvez loke ces termes sur le net.
Une alternative est de se débarrasser de la
.cpp
fichiers par defininig toutes les fonctions dans les en-têtes. De cette façon, vous n'aurez pas à lier la bibliothèque supplémentaire, mais il s'agit pour le coût de l'augmentation des temps de construire, parce que le compilateur à traiter de l'ensemble de ces fonctions à chaque fois que vous inclure l'en-tête, directement ou indirectement, dans l'une de vos unités de traduction.OriginalL'auteur Arne Mertz
Sur Linux:
g++ DRAPEAUX -partagé -Wl,-soname,libLIBNAME..1 -o libLIBNAME.VERSION OBJECT_FILES
où
DRAPEAUX: exemple d'indicateurs (par exemple, -g, -Mur-Wextra, etc.)
LIBNAME: nom de votre bibliothèque
OBJECT_FILES: les objets les fichiers résultant de la compilation de fichiers cpp
VERSION: la version de votre bibliothèque
OriginalL'auteur Claudio