【问题标题】:Error C2491 on C source with Visual studio 8使用 Visual Studio 8 的 C 源代码出现错误 C2491
【发布时间】:2012-09-14 13:11:11
【问题描述】:

我真的是 C 的菜鸟。我只需要编译一个 ANSI C 源代码来获得一个 dll。 在编译期间我收到此错误:

 C2491: 'SelectML': definition of dllimport function not allowed

其中 SelectML 是具有此定义的公共函数:

int CALLINGCONV SelectML(WORD fid, int nSlot)
{
  WORD SW;
  int x;
  BYTE pSend[2];
  pSend[0]=(BYTE)((fid&0xff00)>>8);
  pSend[1]=(BYTE)(fid&0x00ff);
  x=SendAPDUML(hCards[nSlot],APDU_SELECT,2,0,pSend,0,&SW);
  if (x!=C_OK) return x;
  if (SW!=0x9000) return SW;
  return C_OK;
}

我确定C源是好的,也许只是Visual Studio的配置……

这是另一个链接的标题:

#ifndef LIBSIAECARDT_H
#define LIBSIAECARDT_H

#ifdef __cplusplus
extern "C" {
#endif

#if !defined(USE_STDCALL)
#define USE_STDCALL 1
#endif

#ifdef _WIN32
#   if USE_STDCALL == 1
#       define CALLINGCONV_1 _stdcall
#   else 
#       define CALLINGCONV_1
#   endif

#   if defined(LIBSIAE_EXPORTS)
#       define LIBSIAEAPI __declspec(dllexport)
#   else
#       define LIBSIAEAPI __declspec(dllimport)
#   endif

#   define CALLINGCONV LIBSIAEAPI CALLINGCONV_1


#else // ! _WIN32
#   define CALLINGCONV 
#   define LIBSIAEAPI
#   define CALLINGCONV_1
typedef unsigned int UINT;
#endif  // _WIN32

【问题讨论】:

  • 那么CALLINGCONV 是什么?看起来像是导致错误,编译器甚至会告诉你究竟是怎么回事。
  • CALLINGCONV 定义在包含的标头中

标签: c visual-studio compiler-construction


【解决方案1】:

引用MSDN 说明了一切。不要定义函数。宣言很好。您在这里所做的是定义 SelectML,这肯定会产生您的 C2491 错误。

【讨论】:

【解决方案2】:

通常会将像 CALLINGCONV 这样的宏有条件地定义为 __declspec(dllimport) 或 __declspec(dllexport),以便可以在库源代码和使用该库的代码中使用相同的头文件。您的构建可能应该定义一些使它使用 dllexport 的东西。检查 CALLINGCONV 的定义方式或(最好)查阅代码随附的任何构建文档。

【讨论】:

  • 在这种情况下,您应该在项目的预处理器设置中定义 LIBSIAE_EXPORTS
【解决方案3】:

这里有一个替代方案。停止使用 MSVC。在 C90 之后,他们明确放弃了对任何东西的支持。对 C 代码使用实际的 C 编译器。

【讨论】:

  • 反对者,请解释。对于需要编写和编译 C 代码的人来说,这是一个严重的问题。
猜你喜欢
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
  • 2017-11-02
  • 2016-02-14
  • 1970-01-01
  • 1970-01-01
  • 2022-10-31
  • 2021-12-22
相关资源
最近更新 更多