如何在VC ++中删除链接器中的__imp__前缀?

时间:2011-03-01 19:30:42

标签: c++ libcurl

我正在使用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,正确的路径等。

5 个答案:

答案 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

错误消息现在应该消失了。

希望有帮助吗?