2017-10-16 14 views
0

Je travaille normalement en C# et je suis fou d'esprit pour celui-ci. J'ai utilisé pour créer une bibliothèque de liens dynamiques.Erreurs LNK 2019 et LNK2028 pour une fonction dans une classe, d'autres travaux bien

J'ai défini deux méthodes comme indiqué ci-dessous

DeveloperConsoleManager.h

#pragma once 
#include "atlstr.h" 

#ifdef DEVCONSOLEMANAGER_EXPORTS 
    #define DEVCONSOLEMANAGER_API __declspec(dllexport) 
#else 
    #define DEVCONSOLEMANAGER_API __declspec(dllimport) 
#endif 

namespace DeveloperConsoleManager 
{  
    class DeveloperConsoleLogic 
    { 
     public: 
      // Returns a + b 
      static DEVCONSOLEMANAGER_API double Add(double a, double b); 
      static DEVCONSOLEMANAGER_API bool CheckforValidFile(CString fileName); 
    }; 
} 

DeveloperConsoleManager.cpp

// DeveloperConsoleManager.cpp : Defines the exported functions for the DLL application. 
// 

#include "stdafx.h" 
#include "DeveloperConsoleManager.h" 

namespace DeveloperConsoleManager 
{ 
    double DeveloperConsoleLogic::Add(double a, double b) 
    { 
     return a + b; 
    } 


    bool DeveloperConsoleLogic :: CheckforValidFile(CString fileName) 
    {  
     return false; 
    } 
} 

J'utilise ces méthodes dans un fichier .cpp dans un projet différent (type: Application (.exe)). Quand je construis la solution, il y a des erreurs suivantes de l'éditeur de liens

Avertissement 1 avertissement C4273: 'DeveloperConsoleManager :: DeveloperConsoleLogic :: Ajouter': lien dll incompatible e: \ md_69 \ developerconsolemanager \ developerconsolemanager.cpp 10

avertissement 2 avertissement C4273: 'DeveloperConsoleManager :: DeveloperConsoleLogic :: CheckforValidFile': lien dll incompatible e: \ md_69 \ developerconsolemanager \ developerconsolemanager.cpp 16

erreur 3 erreur LNK2028: jeton non résolu (0A0004F1) « public: bool statique __cdecl DeveloperConsoleManager :: DeveloperConsoleLogic :: CheckforValidFile (classe ATL :: CStri ngT>>) "(? CheckforValidFile @ DeveloperConsoleLogic @ DeveloperConsoleManager @@ $$ FSA_NV? $ CStringT @ _WV? $ StrTraitMFC_DLL @ _WV? $ ChTraitsCRT @ _W @ ATL @@@@ ATL @@@ Z) référencé dans la fonction" public : __thiscall vide CSaSsiConsoleUi :: UploadSsiCheck (void) "(? UploadSsiCheck @ CSaSsiConsoleUi @@ $$ FQAEXXZ) E: \ MD_69 \ DeveloperConsoleUI \ SaSsiConsoleUI.obj

erreur 4 erreur LNK2019: symbole externe non résolu" public: bool statique __cdecl DeveloperConsoleManager :: DeveloperConsoleLogic :: CheckforValidFile (classe ATL :: CStringT>>) "(? CheckforValidFile @ DeveloperConsoleLogic @ DeveloperConsoleManager @@ $$ FSA_NV? $ CStringT @ _WV? $ StrTraitMFC_DLL @ _WV? $ ChTraitsCRT @ _W @ ATL @@@@ @ATL @@@ Z) référencé dans la fonction "public: void __thiscall CSaSsiConsoleUi :: UploadSsiCheck (void)" (? UploadSsiCheck @ CSaSsiConsoleUi @@ $$ FQAEXXZ) E: \ MD_69 \ DeveloperConsoleUI \ SaSsiConsoleUI.obj

Erreur 5 Erreur LNK1120: 2 unresolved externals E: \ MD_69 \ Debug \ DeveloperConsoleUi.exe

Il n'y a pas d'erreur d'éditeur de liens pour la méthode "Ajouter".

J'ai déjà inclus "DeveloperConsoleManager.lib" dans Linker -> Input -> Dépendances supplémentaires. S'il vous plaît, aidez-moi à savoir ce que je fais de mal. Je serais heureux d'ajouter toute information supplémentaire nécessaire.

+0

_'DeveloperConsoleManager :: DeveloperConsoleLogic :: Ajouter ': incompatible dll linkage_ –

+0

@ manni66 Je suis désolé mais pourriez-vous élaborer s'il vous plaît – RMad9248

+0

Fixez cela. Peut-être que ça arrange le reste. –

Répondre

0

Grâce à @Igor Tandetnik et à l'incroyable chose qu'est Internet, j'ai compris. Je l'ajoute comme une réponse pour que quelqu'un d'autre puisse en bénéficier.

Le problème était avec CString. Le projet dans lequel la fonction a été définie était une bibliothèque de liens dynamiques (dll) et l'appel était en cours à partir d'une application MFC. Maintenant, le problème était que MFC utilise pour CString tandis que la DLL non-MFC utilise.

CString en est définie comme:

typedef ATL::CStringT< TCHAR, StrTraitMFC_DLL<TCHAR> > CString; 

tout en est défini comme:

typedef CStringT< TCHAR, StrTraitATL<TCHAR> > CString; 

, comme vous pouvez clairement voir est différent. La solution de contournement que j'ai utilisée était using CAtlString instead of CString. Toutefois, n'hésitez pas à suggérer un meilleur moyen si vous rencontrez.