web-dev-qa-db-fra.com

Comment puis-je me débarrasser du préfixe __imp__ dans l'éditeur de liens dans VC ++?

J'utilise libcurl et j'obtiens le type d'erreurs de l'éditeur de liens suivant dans VC++ 10.

1>main.obj : error LNK2019: unresolved external symbol __imp__curl_easy_strerror referenced in function "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl curl_httpget(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?curl_httpget@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ABV12@@Z)

Comment puis-je me débarrasser de ce préfixe imp devant le nom de la fonction? Je fais un lien vers la bonne bibliothèque, le bon chemin, etc.

38
BeeBand

Le préfixe __imp__ Apparaît chaque fois que vous vous liez à une DLL. Il n'apparaît pas lors de la liaison à des bibliothèques liées statiquement. Très probablement, le code est généré pour être lié à une bibliothèque d'importation DLL, mais vous l'avez plutôt lié à une bibliothèque statique.

Le préfixe est ajouté lorsque vous marquez la fonction importée avec __declspec(dllimport) - assurez-vous que vos importations ne l'utilisent pas lorsqu'elles ne sont pas liées à une DLL.

55
Suma

Vous devez ajouter CURL_STATICLIB à Définitions du préprocesseur dans les propriétés de vos projets dans MSVC

17
Kostya Trushnikov

Si vous utilisez des projets générés par l'assistant - vérifiez la valeur "Paramètres d'exécution" dans project properties -> C/C++ -> Code Generation section.

Par défaut, il a généralement la valeur "DLL multithread". Vous avez besoin des valeurs Multithreaded/MT et Multithreaded Debug/MTd.

7
Alfishe

Vous utilisez un fichier d'en-tête qui définit le prototype de la fonction avec le spécificateur évaluant en __declspec(dllimport)

Vous devez soit redéfinir l'instruction qui évalue cela (ne la définir sur rien), soit utiliser un fichier d'en-tête différent.

En général, vous verrez du code comme celui-ci:

#ifdef FOO_EXPORTS
#define DLLSPEC __declspec(dllexport)
#else
#define DLLSPEC __declspec(dllimport)
#endif

...

DLLSPEC bool foo(int bar);

La compilation du projet avec FOO_EXPORTS défini utilisera un mode et sans lui utilisera l'autre.

5
Mahmoud Al-Qudsi