C 编译成dll - AruiLR/MyNote GitHub Wiki

最近用到SM系列的加密库,拿到手的只有封装好的静态库(lib文件),C#或Python无法直接调用,需要将其编译成动态库(dll文件)。由于手上没有加密实现的源码,所以需要把现有的lib文件转换成dll文件,网上相关的内容很少,被折磨了许久后终于找到了解决方法。

lib + 头文件 转 dll(无源码)

Visual Studio 2010 **->** 新建C++ Win32控制台应用程序 **->** dll + 空项目 **->** 项目根目录添加lib文件,源文件目录下添加def文件 **->** 修改项目属性 **-> 链接器**:_输入:附加依赖项_=lib文件名 _忽略特定默认库_=LIBC.lib,_模块定义文件_:=def文件名 ->生成(Release)

**def文件格式:**

LIBRARY SMX #dll名称
EXPORTS

OSR_SM2_Encrypt @ 1
OSR_SM4_Init @ 2

源码 + 头文件 转 dll

使用 _declspec(dllexport)创建dll

  1. 创建工程 Visual Studio 2010 **->** 新建C++ Win32控制台应用程序 **->** dll + 空项目
  2. 在要导出的函数源码前加上_declspec(dllexport)

**温馨提示:**为了能够正确实现C++代码调用其它C语言代码,使用extern "C"来提示编译器按C语言来编译这部分代码。这样做的原因是C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般只包括函数名。

##使用模块定义文件(.def)创建dll

LIBRARY SMX #dll名称
EXPORTS

OSR_SM2_Encrypt @ 1
OSR_SM4_Init @ 2