0
点赞
收藏
分享

微信扫一扫

保证C++或QT导出库函数名不改变的二种方式


1. 导出库使用def模块定义文件导出

使用模块定义文件,并在其中指定导出函数在编译后的DLL中的名称不会被改变.

编译前在def文件中指定什么名称,在编译后就使用该名

2.导出库使用C语言方式编译并指定使用__cdecl调用约定

使用 _declspec(dllexport) 导出函数 ,让C++编译器使用C语言方式编译C++源码,并指定调用约定为__cdecl 这样编译后的函数名不会被动.

让C++编译器使用C方式编译源码有两种方法:

     一种是通过修改后缀名为.c 这样C++编译器认为是C项目,会使用C编译器进行编译

另一种是在C++项目的.h文件中使用 extern "C"  来表示单个函数使用C方式编译

如果有多个函数要使用C方式进行编译可使用下面方式

extern "C"
{
               //这里要使用C方式编译的多个方法
}

示例:

extern "C"  __declspec(dllexport) int __cdecl add(int a,int b);
extern "C"
{
        __declspec(dllexport) int __cdecl add(int a,int b);
        __declspec(dllexport) int __cdecl sub(int a,int b);
}

上面两个示例要求源码都是cpp

下面的代码兼容C与C++编译器

#ifdef __cplusplus
extern "C"  {
#endif
   __declspec(dllexport) int __cdecl add(int a,int b);
   __declspec(dllexport) int __cdecl sub(int a,int b);
#ifdef __cplusplus
}
#endif

举报

相关推荐

0 条评论