2014-04-28 3 views
0

Probablement je manque ici quelque chose mais c'est ma première fois sur Windows que j'ai besoin de relier statiquement une lib de sorte que l'exécutable ne dépende pas d'un DLL. Je le fais avec LIBPNG.Lier une lib statique dans VC++

Je fais comme ça:

  1. I ajouté en-têtes libpng: C/C++ -> supplémentaires include

  2. répertoire de la bibliothèque Ajouté à l'éditeur de liens: Linker -> Général -> supplémentaires Répertoires de bibliothèques

  3. Ajouté dépendances supplémentaires éditeur de liens: linker -> entrée

compiler l'exe ok.When appeler Je reçois:

« Le programme ne peut pas démarrer car libpng16.dll est absent de votre ordinateur . »

Ce qui signifie que libpng n'a pas été compilé dans l'exécutable. Comment puis-je corriger cela sans reference the whole pnglib project code into my executable project?

+1

"libpng16.dll" dans l'erreur indique que ceci est * pas * une bibliothèque statique, mais une bibliothèque liée dynamique. Vous pouvez être bien si vous copiez simplement la DLL dans le même dossier que votre exécutable. Dans le cas contraire, vous devez vous assurer que la bibliothèque prend en charge la liaison statique, puis lier le fichier * correct * .lib pour cela. – crashmstr

+0

@crashmstr Je ne veux pas faire cela. Je veux que libpng soit compilé dans le programme final. –

+0

J'ai édité mon commentaire pour inclure une déclaration que vous devez vérifier: 1. libpng supporte la liaison statique et 2. vous liez avec le .lib correct qui est la bibliothèque statique et non celui qui "pointe" vers la DLL. – crashmstr

Répondre

1

Sous Windows, un .lib est un fichier de bibliothèque, généralement il contient simplement du code qui charge une DLL, recherche les fonctions exportées et leur fournit des wrappers. Mais, vous pouvez construire la lib différemment afin que, au lieu de ces bouchons d'emballage, il contient le code binaire réel. L'opération et la structure du fichier .lib sont identiques - le code qu'il contient dépend de la manière dont il est construit. Donc, si vous avez construit libpng16 en tant que paire lib/dll 'dynamique', vous aurez besoin de la partie dll quand vous le déploierez. Si vous l'avez construit comme une lib statique, alors vous obtiendrez ce que vous voulez.

Le point est - vous devez construire la lib dans le format que vous voulez en premier lieu. Il n'est pas possible de prendre une paire lib/dll et de la convertir en une librairie statique, pas plus qu'il n'est possible de fusionner une DLL dans votre exécutable. (bien, pas possible après que vous l'ayez construit - parfaitement possible si vous changez les paramètres de lib et recompilez pour produire en forme statique de lib, bien sûr)

+0

hmm, pas je vois, je dois alors comprendre comment construire libpng statiquement. –

+0

oui. Utilisez [Lib.exe] (http://msdn.microsoft.com/en-us/library/ms235627.aspx) au lieu de Link.exe pour générer la bibliothèque. – gbjbaanb

+0

Je ne suis pas sûr de vous avoir. –

Questions connexes