VC如何创建C编译器能使用的动态库

方法

  • 使用extern "C"修饰
  • 设置统一的调用约定

举例

  • 例1——使用__cdecl,一般C编译器使用此约定,如LabWidnows/CVI。

    • cpp代码
      extern "C" __declspec(dllexport) uint32 __cdecl glFindDevices(uint32* devCnt);
      
      lib里导出的符号
      __imp__glOpenDevice
      _glOpenDevice
      
  • 例2,实际VC默认使用__stdcall

    • cpp代码

      extern "C" __declspec(dllexport) uint32 glFindDevices(uint32* devCnt);
      

      lib里导出的符号

      imp__glOpenDevice@8
      _glOpenDevice@8
      
  • VC项目属性里可以设置默认的调用约定:[C/C++].[高级].[调用约定]。

结论

  • 如果使用lib文件静态链接dll文件,要保证调用约定和编译器是一致的,否则会因为“找不到外部符号”导致链接失败。
  • 不推荐使用DEF文件导出函数名称,可能会导致C链接器找不到符号。
  • 推荐使用__declspec(dllexport)__declspec(dllexport)导出导入符号。

参考

posted on 2022-12-17 13:11  OctoberKey  阅读(71)  评论(0)    收藏  举报

导航