在 64 位版本的 Visual C++ 编译器收到 LNK4197 错误

适用于: Visual C++ 2010 Express

摘要


使用 64 位版本的 Microsoft Visual C++ 编译器和链接器生成 DLL 时,您可能会收到链接器错误号 LNK4197,如果函数被声明为一次导出。

症状


链接器输出可能类似于如下:
C:\>link /NOLOGO /def:Sample.def /pdb:Sample.pdb /out:Sample.dll  Sample.objSample.obj : warning LNK4197: export 'DllSample' specified multiple times; using first specification   Creating library Sample.lib and object Sample.exp 

原因


当函数被声明为一次导出生成链接器错误号 LNK4197。函数被声明为导出,通过以下方式之一:
  • 在 C 源代码文件中使用__declspec(dllexport)关键字声明该函数:
    __declspec(dllexport) int DllSample() {   return 42;}
  • 该函数声明使用模块定义 (。DEF) 文件:
    EXPORTS   DllSample
此链接器错误可能会经常出现在__declspec(dllexport)关键字和一个。DEF 文件中用于定义中相同的函数名。DLL 项目。

解决方案


若要解决此问题,请定义导出的函数一次,通过使用__declspec(dllexport)关键字或使用。DEF 文件。不要使用这两种方法。

状态


此行为是设计使然。

更多信息


声明为一次导出函数可能不会产生的 32 位版本的 Microsoft Windows c + + 编译器和链接器在本文"症状"一节中描述的链接器错误。但是,Microsoft 建议您在 32 位和 64 位版本的 Windows c + + 编译器和链接器中定义函数导出一次。