Question

Je crée un programme c ++, mais je veux pouvoir proposer uniquement un fichier .exe à l'utilisateur. Cependant, j'utilise des bibliothèques (curl entre autres) qui ont des dll. Est-il possible de compiler ces dll dans le fichier .exe?

J'utilise Code :: Blocks and mingw.

Était-ce utile?

La solution

Pour ce faire, vous aurez besoin de liens statiques . Cela nécessite que toutes vos bibliothèques (et les bibliothèques dont elles dépendent de manière récursive) soient disponibles en tant que bibliothèques statiques. Sachez que la taille de votre exécutable sera grande car il contiendra tout le code de ces bibliothèques statiques. C'est pourquoi les bibliothèques partagées (DLL) ont été inventées pour pouvoir partager le même code entre les applications. Toutefois, cela ne fonctionne pas toujours sur Windows .

Je pense que vous voudrez peut-être un programme d'installation qui installe votre fichier exécutable et tout ce qui en dépend. bibliothèques.

Autres conseils

Il y a un article dans DDJ de 2002 qui pourrait avoir ce que vous voulez:

Fondamentalement, il associe la liaison à la DLL à l'aide de la fonction de "chargement différé" de MSVC et le conditionnement de la DLL en tant que ressource incorporée dans le fichier EXE. La DLL est ensuite extraite automatiquement au moment de l'exécution lorsque le premier appel à l'une des exportations est effectué.

Je n'ai pas utilisé cette technique, je ne peux donc pas vraiment dire si cela fonctionne bien, mais cela semble être une bonne idée.

Vous pouvez utiliser ILMerge

.

Je suis tombé sur l'utilitaire dll2lib . Pièce intéressante, bien que chère. Il vous permet de convertir pratiquement n'importe quelle dll en une bibliothèque statique, qui peut être liée ultérieurement à votre application pour produire un fichier exe. IIRC, la version gratuite affichera certaines notifications (MessageBox) lors de l’entrée d’une fonction à partir de cette bibliothèque générée.

Vous avez besoin d'outils spéciaux tels que XBundler .

Si vous avez vraiment besoin de faire cela, vous pouvez utiliser cette superbe bibliothèque qui vous permettra de charger une DLL à partir de la mémoire. Je l'ai utilisé pour lire une DLL à partir d'une ressource et la charger pour moi.

https://github.com/fancycode/MemoryModule

En général, non. Les DLL ont un comportement spécial non trivial, tel qu'acquérir Loader Lock quand elles sont chargées et appeler DllMain à ces endroits. Bien qu'un éditeur de liens théorique puisse faire en sorte que chaque DllMain soit appelé à partir de l'application main (), cela ne se produirait pas sous Loaded Lock. Ce verrou de chargeur est sous le contrôle du système d'exploitation. De plus, les DLL sont notifiées de nouveaux threads via leur DLLMain, ce qui serait également presque impossible à simuler.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top