2017-03-23 1 views
-1

J'ai une DLL (example.dll) construit en C qui a cette fonction en elle:Pourquoi la méthode de ma bibliothèque externe ne sera-t-elle pas résolue?

void WINAPI free_job() 
{ 
    lc_free_job(jobPtr); 
} 

J'ai construit cette DLL et Linked example.lib dans mon projet Visual C++. Maintenant j'essaye d'appeler la méthode free_job() à partir d'un projet ATL avec un simple objet COM. Voici une partie de ma tête qui fait référence à la bibliothèque:

#include "..\lib\example.h" 

C'est là que je l'appelle dans ma mise en œuvre:

STDMETHODIMP CCerberusSession::Free(CHAR* licensePath, CerberusErrorDetails* error) 
{ 
    free_job(); 
    return S_OK; 
} 

Il ne compilera pas. Je reçois les erreurs suivantes:

Error LNK2019 unresolved external symbol "void __stdcall free_job(void)" ([email protected]@YGXXZ) referenced in function "public: virtual long __stdcall CCerberusSession::Free(char *,struct CerberusErrorDetails *)" ([email protected]@@[email protected]@@Z)

Qu'est-ce que je fais mal et comment puis-je le dépanner ou le réparer? Toutes les idées seraient utiles et appréciées.

Modifier: J'ai essayé d'envelopper le comprennent comme ceci:

extern "C" { 
#include "..\lib\example.h" 
} 

Mais je reçois l'erreur suivante si je tente de compiler comme ceci:

Error MSB8011 Failed to register output. Please try enabling Per-user Redirection or register the component from a command prompt with elevated permissions.

Je courais Visual Studio en tant qu'administrateur. Quoi d'autre pourrait être mauvais ici?

+2

Compile très bien, il ne lie pas. Notez le manchonnage du nom C++ dans le message d'erreur de l'éditeur de liens. Les identifiants C ne sont pas censés être mutilés. Vous avez besoin de 'extern 'C" {} 'autour de ce #include. –

+0

@HansPassant Merci Hans. Si j'emballe l'include, je vois maintenant une erreur différente: 'Erreur MSB8011 Impossible d'enregistrer la sortie. Essayez d'activer la redirection par utilisateur ou enregistrez le composant à partir d'une invite de commande avec des autorisations élevées. J'ai modifié la question. Des idées sur quoi d'autre pourrait être le problème ici? Je ne suis pas sûr mais, cela a-t-il quelque chose à voir avec le fait qu'il s'agisse d'un projet ATL et qu'il ne parvient pas à enregistrer la sortie sur le système? Cela a-t-il quelque chose à voir avec le fait qu'il ne soit pas capable de résoudre la DLL incluse? Toutes les idées seraient d'une grande aide. – Alexandru

+1

Question complètement différente bien sûr. Aucune idée de ce que signifie "autorisations élevées"? Il google très bien, essayez de ne pas être sans défense. –

Répondre

-1

La première question était que je devais conclure cette déclaration #include (merci de le souligner, Hans):

extern "C" { 
#include "..\lib\example.h" 
} 

La deuxième question était due à regsvr32.exe. Il ne peut pas trouver la DLL dépendante que mon application importe car cette DLL n'est pas dans le même répertoire de sortie que mon projet ATL compilé. Par exemple, si vous cochez l'onglet Output dans Visual Studio, vous verrez quelque chose comme ceci:

1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.CppCommon.targets(1749,5): warning MSB3073: The command "regsvr32 /s "C:\Code\Cerberus\Debug\Cerberus.dll"" exited with code 3. 
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.CppCommon.targets(1761,5): error MSB8011: Failed to register output. Please try enabling Per-user Redirection or register the component from a command prompt with elevated permissions. 

J'ai juste besoin d'inclure example.dll dans le répertoire de sortie: C:\Cerberus\Debug\.