2010-04-13 4 views
3

Je dois lier dynamiquement avec OpenSSL libeay32.dll. J'écris une application de console C++ native en utilisant Visual C++ Express 2008.Liaison dynamique dans Visual Studio

J'inclus une entête evp.h de la distribution OpenSSL. Construire et ...:

error LNK2001: unresolved external symbol _EVP_aes_256_cbc 
error LNK2001: unresolved external symbol _EVP_DecryptInit 
error LNK2001: unresolved external symbol _EVP_CIPHER_CTX_init 

Comment faire des appels aux méthodes libeay32.dll? Je ne sais pas où spécifier son nom de fichier

Répondre

2

Dans les propriétés du projet, propriétés de configuration, éditeur de liens, entrée - ajoutez le nom de la bibliothèque sous "dépendances supplémentaires".

[Notez que ce lien est en fait STATIQUEMENT lié à la bibliothèque. Si vous voulez vraiment charger dynamiquement la bibliothèque, vous devez appeler LoadLibrary() sur la DLL, puis obtenir des pointeurs de fonction pour les fonctions dont vous avez besoin à l'aide de GetProcAddress().

Voir par exemple

http://msdn.microsoft.com/en-us/library/ms886736.aspx

et

http://msdn.microsoft.com/en-us/library/ms885634.aspx

+3

Ce n'est pas vraiment un lien statique ... La recherche de symbole réelle et s'assurer que les appelants pointent vers les callees se produit toujours de façon dynamique à l'exécution. – sblom

+0

Puis-je avoir deux autres questions? 1. J'ai un projet dll dans ma solution. Pour y accéder, je fais ce qui suit. Clic droit sur mon projet exe -> propriétés -> Propriétés communes -> Framework & Références -> Ajouter une nouvelle référence -> dans la fenêtre ouverte je choisis mon projet dll de la liste. Une remarque importante que ce ne sont pas des assemblages gérés. Tout est natif. Puis j'inclus un fichier d'en-tête dans mon projet exe, build et tout va bien ... Comment exactement VS se comporte dans ce cas? Puis-je lier à libeay32.dll de la même manière? Il n'y a pas d'option pour naviguer vers la DLL ... – ILya

+0

2. Après avoir utilisé .lib pour lier, puis-je simplement remplacer un libeay32.dll pour le mettre à jour. Ou je vais devoir lier mon projet? – ILya

3

Il y a probablement un fichier .lib que vous devez également ajouter à l'entrée de l'éditeur de liens de votre compilateur. Consultez la documentation de la bibliothèque que vous utilisez.

+0

J'ai un .lib fichier. Mais comme je sais que c'est pour la liaison statique ... – ILya

3

Essayez d'utiliser la fonction LoadLibrary de Win32 API, le lien suivant pourrait être une aide: example

3
  1. si votre applicat ion doit pouvoir fonctionner sans l'existence d'OpenSSL, utiliser la liaison dynamique avec explicit run-time linking et gérer les cas où les DLL ne sont pas présentes (par ex. en changeant le comportement de votre application/passage à d'autres bibliothèques).
    J'ai récemment trouvé une belle exemples à ce sujet:
  2. si votre application ne peut fonctionner si le OpenSSL existe dans l'environnement (ou vous expédier la DLL), l'utilisation implicite liaison d'exécution.
    Pour MSVC, le plus simple est d'ajouter #pragma comment(lib,"libeay32.lib") dans votre code source (Vous aurez probablement besoin du talon .lib être produit par le même compilateur que vous utilisez)
  3. si votre application doit être indépendante de l'environnement. Lier OpenSSL de manière statique (utilise également .lib).

Notez qu'il existe 2 types de .lib. Le premier est utilisé pour la liaison dynamique mais implicite, le second est pour la liaison statique. Celui pour la liaison implicite dynamique contient des stubs qui chargent la DLL pour vous alors que celui pour la liaison statique contient l'implémentation réelle.

0

Si vous appelez une méthode à partir de la DLL, vous pouvez utiliser la méthode de liaison dynamique explict. Erreur: vous incluez une entête evp.

h de OpenSSL distribution dll à votre prohject

Comme vous liez dynamiquement, inutile d'inclure .h d'une DLL à votre projet.

  • Vous pouvez appeler en suivant la méthode:
    1. LoadLibrary ("libeay32.dll");/* syntaxe: */
    2. Déclare un pointeur de fonction pointant vers la fonction que vous voulez appeler.

Pour exemple.

Laissez votre libeay32.dll a une fonction exportée: int add(int x, int y);

Puis l'appeler dans votre projet déclarer un pointeur de fonction, puis appeler la méthode ajouter comme suit:

typedef int (*AddfnPtr)(int num1, int num2); 
    int num1 = 2, num2 = 3 ; 

    HMODULE handle = NULL; 
    handle = LoadLibrary("libeay32.dll"); 

    if (handle != NULL) 
    { 
     AddfnPtr addfnptr = (AddfnPtr)GetProcAddr(handle, NULL); 
     if (addfnptr != NULL) 
     { 
      int res = addfnptr(num1,num2); 
      cout << "res = "<<res; 
     } 
    }