由C++生成C接口函数库方法

  • 格式:doc
  • 大小:26.00 KB
  • 文档页数:2

下载文档原格式

  / 3
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

由C++生成C接口函数库的方法

1、在Visual C++中创建动态链接库工程。

2、函数声明方式为:__declspec(dllexport) void function();

加入__declspec(dllexport)的作用是提示编译器myfunction()函数为dll文件的输出函数。同样道理,定义dll输出变量也应在声明前加__declspec(dllexport)。

3、欲使输出函数按照C语言标准编译需要加入extern “C”.如下:

extern “C”{

__declspec(dllexport) void function1();

__declspec(dllexport) void function2();

__declspec(dllexport) void function3();

__declspec(dllexport) void function4();

}

注意”C”这里的C必须是大写的。

这里详细说明extern “C”{ }的作用。

首先,需要了解的是C++和C函数编译方式的差异,由于C++里面支持函数的重载,因此编译出来的.obj或者库文件里面,函数名会被加上和参数有关的签名,用来区分同样函数名参数不同的函数。然而C语言不支持重载,所以函数名里面没有这样的签名。

这样,当C语言的程序调用C++写成的库的时候,就会找不到函数。

比如,一个函数叫void foo(int bar)之类的,可能会在c++编译成叫foo_i之类的名字,而在c语言里面就会编译成foo,这样c语言的程序去找foo就会找不到,这样连接的时候会出错。

为了解决这个问题,引入了extrn "c"{},在这个的作用域之内,c++的函数名不会加上参数签名,和c语言的标准保持统一,就兼容c语言的程序了。

4、接口函数不能存在C++支持而C不支持的形参。如std::string等。生成的库可以像C语言链接库一样被使用。

可以采用以下模板

//mylib.h

#define EXPORT_API __declspec(dllexport)

extern “C”{

EXPORT_API void function1();

EXPORT_API void function2();

}

//mylib.cpp

#include “mylib.h”

EXPORT_API void function1()

{

}

EXPORT_API void function2()

{

}