分享一个跨平台的头文件

网友投稿 703 2022-10-25

分享一个跨平台的头文件

分享一个跨平台的头文件

文章目录

​​一、前言​​​​二、头文件​​​​三、预定义的宏​​

​​1. 平台宏定义​​​​2. 编译器宏定义​​

​​四、Windows 平台场景分析​​

​​1. 编译生成库文件​​​​2. 使用库​​

​​五、Linux 平台场景分析​​

一、前言

我们平常在写代码的时候,特别是在制造轮子的时候(为别人提供库文件),会遇到各种不同的需求场景:

有些人需要在 Linux 系统下使用,有些人需要在 Windows 系统下使用;有些人使用 C 语言开发,有些人使用 C++ 来开发;有些人使用动态库,有些人使用静态库;

这篇短文分享一个头文件,利用这个头文件,再加上几个编译期间传递的宏,就可以完美的处理刚才所说的各种需求。

二、头文件

先直接上代码,可以先试着分析一下,后面我们再逐一分析不同的使用场景。

void MY_API do_work();

下面是头文件:

_Pragma("once")#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) #define MY_WIN32#elif defined(linux) || defined(__linux) || defined(__linux__) #define MY_LINUX#endif#if defined(MY_WIN32) #ifdef MY_API_STATIC #ifdef __cplusplus #define MY_API extern "C" #else #define MY_API #endif #else #ifdef MY_API_EXPORTS #ifdef __cplusplus #define MY_API extern "C" __declspec(dllexport) #else #define MY_API __declspec(dllexport) #endif #else #ifdef __cplusplus #define MY_API extern "C" __declspec(dllimport) #else #define MY_API __declspec(dllimport) #endif #endif #endif#elif defined(MY_LINUX) #ifdef __cplusplus #define MY_API extern "C" #else #define MY_API #endif#endif

三、预定义的宏

假设需要写一个库文件,提供给别人使用。定义了上面这个头文件之后,其他的文件中都要 include 这个头文件。

1. 平台宏定义

不同的平台预定义了相应的宏定义,例如:

Windows 平台:WIN32, _WIN32, WIN32; Linux 平台:linux, __linux, linux;

在一个确定的平台上,这些宏不一定全部定义,很可能只有其中的某一个宏是被定义的。

为了统一性,我们在头文件的刚开始部分,把这些可能的宏统一起来,定义我们出我们自己的平台宏定义:MY_WIN32 或者是 MY_LINUX,后面需要区分不同的平台时,就用这个自己定义的平台宏。

当然,还可以继续扩充出其他平台,例如:MY_MAC, MY_ARM 等等。

2. 编译器宏定义

四、Windows 平台场景分析

1. 编译生成库文件

(1) 生成静态库

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 平台下就简单多了,只需要注意编译器的问题,而没有导出和导入之分。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Canopy - F#开源web自动化和测试框架
下一篇:Pluto-Android:高度整合Android应用开发框架
相关文章

 发表评论

暂时没有评论,来抢沙发吧~