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

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

时间:2023-03-18 01:07:41 科技观察

1.前言2.示例代码说明3.Linux系统下运行4.Windows系统下运行5.总结1.前言在上一篇文章中(使用cmake构建跨平台应用框架:C语言版),我们演示了使用cmake作为构建工具,以源码的形式编译跨平台的动态库、静态库和应用程序。本文描述了相同的功能,但使用C++编码,并有一个小的补充:如果在导出的库文件中,使用了另一个第三方库。二、示例代码说明1、功能说明示例代码的主要目的是描述如何组织一个跨平台的应用程序结构。它的功能比较简单,如下图所示:2、文件结构libA:编译得到库文件libA.so/libA.a;libB:编译得到库文件libB.so/libB.a,需要调用libA库函数;appC:应用程序,需要调用libB库中的函数;三、Linux系统下操作1.通过cmake命令生成Makefile文件为了不污染源代码,我们新建一个build目录,然后在里面编译:$makebuild$cdbuild$cmake..编译输出结果:2.编译libA$cdlibA/src$make编译结果如下:安装到源码下的输出目录:$makeinstall此时相关文件安装到源码路径下libA的输出目录:3.编译libB由于libB调用了libA中的函数,所以需要手动将相关的头文件和库文件复制到libB目录下。当然这一步也可以写在CMakeLists.txt中。然后进入build/libB/src目录,执行编译命令:$cdbuild/libB/src$make同理将libB生成的库文件和头文件复制到源码中的libB/output目录下:4.编译并编译执行程序appC需要手动将相关的头文件和库文件复制到appC目录下的include 和 lib/linux目录下,因为appC调用了libB中的函数。另外,由于我一直使用动态库,所以还需要将libA的头文件和库文件复制到appC目录下。然后进入build/appC/src目录,执行编译命令:$cdbuild/appC/src$make执行输出结果:4.Windows系统下运行1.生成VS解决方案在build目录下执行cmake..得到VS解决方法:打开工程文件CppFrame.sln,右边的解决方法如图:2.编译libA,右击libA_shared,选择【Build】:可以看到在build\中生成了编译\libA\src\Debug目录文件:这里有一个问题需要注意:在libA/src/CMakeLists.txt中,如果编译动态库,请设置如下:如果编译静态库,请设置如下:这些宏定义需要结合ADll.h中的定义来理解,主要解决Windows平台下动态库的导出导入问题。下面编译libB库时也需要进行同样的操作。3、编译libB由于libB调用了libA中的函数,所以需要手动将libA库相关的头文件和库文件复制到libB 目录下。在libB_sharedtarget上,点击【Generate】,编译输出如下:此时在build/libB/src/Debug目录下,可以看到生成的库文件:我们手动复制libB库文件和header文件到appC目录下载备用。4、编译appC在VS的主目标上,点击【Build】,编译输出如下:此时在build\appC\src\Debug目录下可以看到可执行程序main.exe。为了执行这个程序,还需要将libA.dll、libB.dll复制到当前目录下,如下图:五、小结本文的运行过程主要是基于动态库的。如果编译使用静态库,执行过程是一样的。本文转载自微信公众号“IOT物联网小镇”,可通过以下二维码关注。转载请联系物联小镇公众号。