在使用不同平台的电脑时,使用的编译也会不一样,如果想把一个项目在不同平台下编译,那有什么方式可以实现这样的需求呢,这就是这篇文章就来介绍其中的一种方式,就是使用cmake,cmake 并不直接建构出最终的软件,而是产生标准的建构档,然后再借助编译工具来构建。
| 环境搭建
在windows可以使用cmake+vscode+mingw配合使用构建,还需要把mingw32-make.exe,复制一份,将其中一份重命名为make.exe,以实现在不同平台下可以直接使用make指令。在ubuntu中可以使用cmake+vscode+gcc来构建,ubuntu一般会自带gcc。vscode需要安装几个相关插件:
c/c++cmakecmake tools
可以通过 cmake --version 来查看是否安装成功,相关的安装直接百度以下就可以;注意不同平台下使用的命令可能会有差别,笔者使用的是ubuntu系统来操作。
| 简单使用
同目录单文件
1、先看文件树
main.c源码文件
#include stdio.hint main(){ printf(ok); return 0;}
cmakelists.txt配置文件
# cmake 最低版本号要求cmake_minimum_required (version 2.8)# 项目信息project (demo1)# 指定生成目标add_executable(demo main.c)
2、构建makefile文件
创建好文件夹后,再进入build文件夹, 使用 cmake .. 命令构建makefile文件:
3、通过gcc编译
在makefile同级目录下使用 make 命令编译,就会生成一个可执行文件demo文件:
4、执行可执行文件
同目录多文件
1、编写文件
在上边的基础上,把生成的文件删除,再添加两个文件:
main.c源码文件
#include stdio.h#include hello.hint main(){ printf(ok); hello(); return 0;}
hello.c源码文件
#include hello.hvoid hello(void){ printf(hello);}
hello.h源码文件
#ifndef __hello__#define __hello__#include stdio.hvoid hello(void);#endif
cmakelists.txt配置文件(使用方式二):
方式一:通过手动指定源码文件
# cmake 最低版本号要求cmake_minimum_required (version 2.8)# 项目信息project (demo1)# 指定生成目标add_executable(demo main.c hello.c)
方式二:查找当前目录下的所有源文件
# cmake 最低版本号要求cmake_minimum_required (version 2.8)# 项目信息project (demo1)# 查找当前目录下的所有源文件# 并将名称保存到 dir_srcs 变量aux_source_directory(. dir_srcs)# 指定生成目标(自动查找)add_executable(demo ${dir_srcs})
2、构建makefile文件
3、生成可执行文件
不同目录多文件
不同目录下的处理,就是把文件编译成库,再在对应位置链接进去。
1、先看文件树
main.c 和 hello.c 和hello.h都可同目录多文件案例源码一样。
顶层的cmakelists.txt配置:
# cmake 最低版本号要求cmake_minimum_required (version 2.8)# 项目信息project (demo3)# 查找当前目录下的所有源文件# 并将名称保存到 dir_srcs 变量aux_source_directory(. dir_srcs)# 添加 hello 子目录add_subdirectory(hello)# 指定生成目标 add_executable(demo main.c)# 添加链接库target_link_libraries(demo hellofunctions)
hello文件夹中的cmakelists.txt配置:
# 查找当前目录下的所有源文件# 并将名称保存到 dir_lib_srcs 变量aux_source_directory(. dir_lib_srcs)# 生成链接库add_library (hellofunctions ${dir_lib_srcs})
2、构建makefile文件
3、生成可执行文件
文件的路径一定要是写对,不然编译会出问题:
正确的写法如下:
执行可执行文件:
这就是cmake的简单用法,可以根据自己需求进行深入学习。
特朗普签署国防授权法案,禁止只用华为和中兴的零部件
场效应管厂商:华昕科技(上海)有限公司简介
摩托罗拉Edge+已通过认证该机支持5G网络并搭载了1亿像素摄像头
多级放大器噪声系数的计算
针对固件安全、数据安全、数据销毁做了安全设计的硬盘来解决安全问题
跨平台编译工具cmake的简单使用
人工智能SOTA什么意思
华为Nova2 Plus魔镜版、小米6亮银版今日同步发售,你准备抢购哪家?
嵌入式冰箱有独特的优点但也有难以克服的缺点 选购时需要谨慎考虑
详细谈一谈MCU的技术原理编辑
如何实现高转矩伺服电机的应用设计
华为Mate40手机在国外卖高价
Preemptive解决方案:Xamarin应用程序加固与防护
图神经网络的重要意义
绿色网络打造国内运营商乃至全球运营商网络转型和业务转型的样板
微软与Unity合作发布了HoloLens 2开发版
ELEXCON2017京瓷展台亮点前瞻
L-com诺通新型6类以太网线缆组件的特征
UR机械臂上位机开发,以实现更广泛的应用
整体参与人数超200万丨OPPO浏览器春节系列活动圆满收官