头文件+宏,完美解决声明函数问题!

道哥分享
关注

2. 编译器宏定义

如果在写库代码的时候,使用的是 C++,而使用者使用的是 C 语言,那么就需要对库函数进行 extern “C” 声明,让编译器不要对函数的名称进行改写。

编译器 g++ 预定义了宏 __cplusplus,因此,在头文件中,就利用了这个宏,在 MY_API 中添加 extern "C" 声明。

四、Windows 平台场景分析

 1. 编译生成库文件

(1) 生成静态库

在静态库中,不需要 __declspec(dllexport/dllimport) 的声明,因此只需要区分编译器即可(gcc or g++),在编译选项中定义宏 MY_API_STATIC,即可得到最终的 MY_API 为:

gcc 编译器:#define MY_API  
g++ 编译器:#define MY_API extern "C"  

(2) 生成动态库

在编译选项中,定义宏 MY_API_EXPORTS,这样最终得到的 MY_API 就会变成:

gcc 编译器:#define MY_API __declspec(dllexport)

g++ 编译器:#define MY_API extern "C" __declspec(dllexport)

2. 使用库

在使用库的应用程序中,也需要在代码中 include 这个头文件,然后加上编译选项中定义的各种宏,来生成对应的 MY_API 宏定义。

(1) 使用静态库

需要在编译选项中定义 MY_API_STATIC,即可得到最终的 MY_API 为:

gcc 编译器:#define MY_API
g++ 编译器:#define MY_API extern "C"

(2) 使用动态库

在编译选项中不需要任何宏定义,即可得到最终的 MY_API 为:

gcc 编译器:#define MY_API extern "C" __declspec(dllimport)

g++ 编译器:#define MY_API __declspec(dllimport)

这样就相当于声明导入库函数了。

五、Linux 平台场景分析

Linux 平台下就简单多了,只需要注意编译器的问题,而没有导出和导入之分。


声明: 本文由入驻OFweek维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。
侵权投诉

下载OFweek,一手掌握高科技全行业资讯

还不是OFweek会员,马上注册
打开app,查看更多精彩资讯 >
  • 长按识别二维码
  • 进入OFweek阅读全文
长按图片进行保存