我正在使用libcurl,并且在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)
如何摆脱功能名称前面的 imp 前缀?我正在链接到正确的lib,正确的路径等。
答案 0 :(得分:54)
只要链接到DLL,就会出现__imp__
前缀。链接到静态链接库时不会出现。很可能生成的代码是链接到DLL导入库,但是你已经将它与静态库链接了。
使用__declspec(dllimport)
标记导入的函数时会添加前缀 - 请确保在未链接DLL时导入未使用此内容。
答案 1 :(得分:17)
您必须在MSVC中的项目属性中将 CURL_STATICLIB 添加到预处理器定义
答案 2 :(得分:7)
如果使用向导生成的项目 - 请在project properties -> C/C++ -> Code Generation
部分中查看“运行时设置”值。
默认情况下,它通常具有“多线程DLL”值。您需要多线程/ MT和多线程调试/ MTd值。
答案 3 :(得分:5)
您正在使用一个头文件来定义函数原型,并使用对__declspec(dllimport)
您需要重新定义正在评估此语句的语句(将其设置为空),或者完全使用不同的头文件。
通常你会看到这样的代码:
#ifdef FOO_EXPORTS
#define DLLSPEC __declspec(dllexport)
#else
#define DLLSPEC __declspec(dllimport)
#endif
...
DLLSPEC bool foo(int bar);
使用定义的FOO_EXPORTS编译项目将使用一种模式,没有它将使用另一种模式。
答案 4 :(得分:0)
如Suma所述,<your_library>.dll
通常带有<your_library>.lib
。因此,如果您收到类似这样的错误消息
Error LNK2019 unresolved external symbol __imp__<your_symbol> referenced in function ...
强烈建议检查项目的链接器设置。
在Visual Studio中,只需将项目移至
Properties -> Linker -> General
,然后检查条目Additional Library Directories
下是否定义了<your_library>.lib
的路径。如果没有,只需添加即可。
然后检查并定义
Properties -> Linker -> Input
在条目Additional Dependencies
下可能丢失的<your_library>.lib
。
错误消息现在应该消失了。
希望有帮助吗?