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

Bee*_*and 39 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)
Run Code Online (Sandbox Code Playgroud)

如何摆脱函数名称前面的imp前缀?我链接到正确的lib,正确的路径等.

Sum*_*uma 57

__imp__ 当你链接到一个DLL出现前缀.链接到静态链接库时不会出现.很可能生成的代码是链接到DLL导入库,但您已将其与静态库链接.

使用时标记导入的函数时添加前缀__declspec(dllimport)- 确保在未链接DLL时导入未使用此参数.

  • Dll伴随着.lib.您通过链接此附带的.lib链接到DLL.通过名称知道.lib是静态库还是dll"trampoline"是不可能的,要知道你需要检查.lib内部,但.lib需要匹配你的导入. (3认同)
  • 谢谢@苏玛!就我而言,有一个 ifdef 导致了“__declspec(dllimport)”,尽管它是 dll 的依赖项。依赖项被构建为静态库,但这并不影响 ifdef。 (2认同)

小智 17

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


Alf*_*she 7

如果使用向导生成的项目 - 请在project properties -> C/C++ -> Code Generation部分中选中"运行时设置"值.

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


Mah*_*dsi 5

您正在使用头文件来定义函数原型,并使用指定符进行评估 __declspec(dllimport)

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

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

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

...

DLLSPEC bool foo(int bar);
Run Code Online (Sandbox Code Playgroud)

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