一、前言
我们在写应用程序的过程中,经常需要面对一个开发场景:编写跨平台的应用程序。
这种要求对于 Linux 系列的平台来说,还是比较好处理的,大部分情况下只需要换一个交叉编译工具链即可,涉及到硬件平台相关部分再嵌入几个内联汇编。
但是,对于 Windows 平台来说,就稍微麻烦一些。你可能会说,在 Windows 平台上用 cygwin, minGW 也可以统一编译啊,但是你能指望客户在安装你的程序时,还需要去部署兼容 Linux 的环境吗?最好的解决方式,还是使用微软自家的开发环境,比如VS等等。
之前,我曾经在 B 站上传一个类似的小视频,用 C++ 来写一个跨平台的应用程序结构。后来有小伙伴希望提供一个 C 语言版本的,于是有了这篇文章。
这篇文章,我们就以一个最简单的程序,来描述如何使用 cmake 这个构建工具,来组织一个跨平台的应用程序框架。
阅读这篇文章,您可以收获下面几个知识点:
cmake 在编译库文件、应用程序中的相关指令;
Windows 系统中的动态库导出、导入写法;
如何利用宏定义来进行跨平台编程;
二、示例代码说明
1. 功能描述
示例代码的主要目的,是用来描述如何组织一个跨平台的应用程序结构。它的功能比较简单,如下图所示:
2. 文件结构
Common:放置一些开源的第三方库,例如:网络处理,json 格式解析等等;
Application: 应用程序,使用 Utils生成的库;
Uitls:放置一些工具、助手函数,例如:文件处理、字符串处理、平台相关的助手函数等等,最后会编译得到库文件(动态库 libUtils.so、静态库 libUtils.a);
如果扩展其他模块,可以按照 Utils 的文件结构复制一个即可。
3. cmake 构建步骤
在示例代码根目录下,有一个“总领” CMakeLists.txt 文件,主要用来设置编译器、编译选项,然后去 include 其他文件夹中的 CMakeLists.txt 文件,如下:
4. Utils 目录说明
这个目录的编译输出是库文件:
Linux 系统:libUtils.so, libUtils.a;
Windows 系统:libUtils.dll, libUtils.lib, libUtils.a;
其中的 CMakeLists.txt 文件内容如下:
目前,代码中只写了一个最简单的函数 getSystemTimestamp(),在可执行应用程序中,将会调用这个函数。