46

我正在使用 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前缀?我正在链接到正确的库、正确的路径等。

4

5 回答 5

73

__imp__ 只要您链接到 DLL,就会出现前缀。链接到静态链接库时不会出现。很可能生成的代码与 DLL 导入库链接,但您已将其与静态库链接。

当您使用 - 标记导入的函数时添加前缀__declspec(dllimport)- 确保您的导入在不链接到 DLL 时不使用它。

于 2011-03-01T19:34:27.850 回答
20

您必须在 MSVC 中的项目属性中将CURL_STATICLIB添加到预处理器定义

于 2012-09-24T09:06:59.597 回答
9

您正在使用定义函数原型的头文件,说明符评估为__declspec(dllimport)

您需要重新定义对此进行评估的语句(将其设置为空),或者完全使用不同的头文件。

通常你会看到这样的代码:

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

...

DLLSPEC bool foo(int bar);

编译定义了 FOO_EXPORTS 的项目将使用一种模式,没有它将使用另一种模式。

于 2011-03-01T19:39:39.867 回答
7

如果使用向导生成的项目 - 检查project properties -> C/C++ -> Code Generation部分中的“运行时设置”值。

默认情况下,它通常具有“多线程 DLL”值。您需要多线程 /MT 和多线程调试 /MTd 值。

于 2013-10-18T17:07:27.000 回答
0

正如 Suma 提到的,<your_library>.dll通常伴随着<your_library>.lib. 因此,如果您收到此类错误消息,例如

Error LNK2019 unresolved external symbol __imp__<your_symbol> referenced in function ...

强烈建议检查项目的链接器设置。

在 Visual Studio 中,只需为您的项目

Properties -> Linker -> General

并检查 entry 下是否定义Additional Library Directories了路径<your_library>.lib。如果没有,只需添加它。

然后检查并定义

Properties -> Linker -> Input

在条目Additional Dependencies下可能丢失<your_library>.lib

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

希望能帮助到你?

于 2019-11-09T08:38:46.737 回答