当前位置: 首页 > 科技观察

使用Cmake搭建跨平台应用框架:C语言版

时间:2023-03-13 08:41:47 科技观察

1.前言2.示例代码说明3.Linux系统下的操作步骤4.Widnows系统下的操作步骤5.总结1.前言我们在编写应用程序中在这个过程中,我们经常需要面对一个开发场景:编写跨平台应用程序。这种需求对于Linux系列平台来说还是比较容易处理的。大多数情况下,只需要换一个交叉编译工具链,涉及到硬件平台相关的部分,嵌入几个内联汇编器就可以了。不过对于Windows平台来说,就稍微麻烦一些。你可能会说在Windows平台上使用cygwin和minGW也可以统一编译,但是你能指望客户在安装你的程序时部署一个兼容linux的环境吗?最好的解决办法是使用微软自己的开发环境,比如VS等。之前在B站上传过一个类似的小视频,用C++写了一个跨平台的应用结构。后来有个小伙伴想提供一个C语言版本,于是就有了这篇文章。在这篇文章中,我们用最简单的程序来描述如何使用cmake构建工具来组织一个跨平台的应用程序框架。阅读本文后,您可以获得以下知识点:编译库文件和应用程序的cmake相关说明;Windows系统动态库导出导入编写;如何使用宏定义进行跨平台编程;二、示例代码说明1、功能说明示例代码的主要目的是描述如何组织一个跨平台的应用程序结构。它的功能比较简单,如下图所示:2.文件结构常用:放置一些开源的第三方库,比如:网络处理,json格式解析等;Application:应用程序,使用Utils生成的库;uitls:放置一些工具和辅助函数,如:文件处理、字符串处理、平台相关的辅助函数等,最终会编译出库文件(动态库libUtils.so,静态库libUtils.a);如果扩展其他模块,可以按照复制Utils的文件结构即可。3.cmake构建步骤在示例代码的根目录下,有一个“leader”CMakeLists.txt文件,主要用来设置编译器和编译选项,然后include其他文件夹下的CMakeLists.txt文件,如下:4.Utils目录显示该目录编译输出为库文件:Linux系统:libUtils.so,libUtils.a;Windows系统:libUtils.dll、libUtils.lib、libUtils.a;CMakeLists.txt文件内容如下:目前,代码中只写了一个最简单的函数getSystemTimestamp(),在可执行应用程序中会调用这个函数。5.应用目录说明该目录编译输出为:一个可执行程序,调用libUtils库中的函数。CMakeLists.txt文件内容如下:三、Linux系统下操作步骤1、创建构建目录build$mkdirbuild在独立的构建目录下编译,生成的中间代码不会污染源代码,所以是适用于git等版本控制工具,非常方便。提交时只需要忽略构建目录即可。强烈建议这样处理。2.执行cmake生成Makefile$cdbuild$cmake..3.编译Utils库$cdUtils/src$makeCMakeLists.txt的最后一部分是安装说明,将生成的库文件和头文件安装到源码安装目录。$makeinstall4。编译可执行程序ApplicationApplication使用libUtils.so库,所以需要手动将libUtils.so和头文件复制到Application下对应的lib/linux和include目录下。当然这个操作也可以写在Utils安装命令中。$cdbuild/Application/src$make执行生成的可执行程序main,可以看到输出结果。四、Windows系统下操作步骤1、通过cmake命令生成VS工程。同样的方法,创建一个build目录,然后在里面执行cmake..命令生成VS方案。我用的是VS2019:2.编译Utils库文件用VS2019打开工程文件DemoApp.sln,在右边的解决方案中,可以看到:右击libUtils_shared,选择【Build】:此时,在目录下build\Utils\src\Debug,可以看到生成了3.编译可执行程序Application因为Application需要用到Utils生成的库,所以需要手动将库和头文件复制到lib/win32和include目录下应用。在VS解决方案窗口中,在主目标上右击选择【Build】:此时在build\Application\src\Debug目录下可以看到生成的可执行程序:直接点击main.exe执行,报错:需要将libUtils.dll动态库文件复制到main.exe所在目录,然后执行才能成功。五、小结本文的运行过程主要是基于动态库的。如果编译使用静态库,执行过程是一样的。如果操作过程中有什么问题,欢迎留言讨论,谢谢!在公众号后台留言【430】,即可领取示例代码。可在Linux/Windows系统中直接编译执行,即用即用。祝你好运!