【CMake】CMake 引入 ( Android Studio 创建 Native C++ 工程 | C/C++ 源码编译过程 | Makefile 工具 | CMake 引入 )(二)

简介: 【CMake】CMake 引入 ( Android Studio 创建 Native C++ 工程 | C/C++ 源码编译过程 | Makefile 工具 | CMake 引入 )(二)

二、C/C++ 源码编译过程


上述 Native C++ 工程中的 C++ 代码是在 CMake\app\src\main\cpp 目录下的 native-lib.cpp ;


如果将该 native-lib.cpp 源码打包成 Kotlin 或 Java 中通过 JNI 可调用的 so 动态库 , 需要使用 Make 工具进行编译 ;


Make 工具需要使用 Makefile 命令 , 如 " g++ native-lib.cpp " , 编译的默认输出结果是 a.out 文件 ;


如果指定默认名字就使用 " gcc native-lib.cpp -o main " , 此时编译输出的结果是 main 文件 ;


gcc native-lib.cpp 命令执行的完整的编译过程 , 包括 预处理 , 编译 , 汇编 , 链接 四个过程 , 参考 【C 语言】编译过程 分析 ( 预处理 | 编译 | 汇编 | 链接 | 宏定义 | 条件编译 | 编译器指示字 ) 博客 ;


image.png


编译过程 : 预处理 -> 编译 -> 汇编 -> 链接;


编译预处理 : 产生 .i 后缀的预处理文件;

编译操作 : 产生 .s 后缀的汇编文件;

汇编操作 : 产生 .o 后缀的机器码二进制文件;

链接操作 : 产生可执行文件 ;





三、Makefile 工具


如果源码个数较少可以直接使用 " gcc native-lib.cpp native-lib2.cpp … " 命令 , 逐个将源码添加在 gcc 之后 , 如果源码个数太多 , 达到几百上千个 , 此时就需要使用 Makefile 编译工具了 , 编写 Makefile 脚本 , 然后直接执行该脚本 , 即可完成数量庞大的源码编译工作 ;


Makefile 参考 【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境) 博客 ;


Makefile 脚本示例 : 这是拷贝自上面的博客 , 用于编译汇编文件的脚本 ;


all: led.o 
  @arm-linux-ld -Tled.lds -o led.elf $^
  @arm-linux-objcopy -O binary led.elf led.bin
led.o : led.S
  arm-linux-gcc -g -o $@ -c $^
.PHONY: clean
clean:
  rm *.o led.elf led.bin


在 Makefile 的当前目录 , 执行 make 命令 , 会自动执行 Makefile 脚本中的编译命令 ;






四、CMake 引入


Makefile 在 Linux 下有其固定的编写格式 , 在 Windows 下有另外一种编写格式 , 不同的平台的 Makefile 的编写格式都不同 , 非常不利于跨平台 ;


CMake 解决了上述 Makefile 跨平台问题 , 使用 CMake 可以完美处理在不同平台之间的 Makefile 不兼容的问题 ;


CMake 可以生成不同平台的 Makefile 文件 ;


目录
相关文章
|
1月前
|
安全 编译器 C++
【C++20概念】编译时多态性的力量
【C++20概念】编译时多态性的力量
49 0
|
18天前
|
存储 人工智能 机器人
【C++面向对象】C++图书管理系统 (源码)【独一无二】
【C++面向对象】C++图书管理系统 (源码)【独一无二】
|
18天前
|
存储 人工智能 机器人
【C/C++】C++学籍信息管理系统(源码+报告)【独一无二】
【C/C++】C++学籍信息管理系统(源码+报告)【独一无二】
|
23天前
|
人工智能 机器人 测试技术
【C/C++】C语言 21点桌牌游戏 (源码) 【独一无二】
【C/C++】C语言 21点桌牌游戏 (源码) 【独一无二】
|
24天前
|
存储 人工智能 BI
【C++面向对象】C++银行卡管理系统(源码+论文)【独一无二】
【C++面向对象】C++银行卡管理系统(源码+论文)【独一无二】
|
24天前
|
存储 C++
【C++】Visual Studio C++ 配置并使用gtest(不好用你捶我)
【C++】Visual Studio C++ 配置并使用gtest(不好用你捶我)
|
28天前
|
Java Android开发
Android Studio的使用导入第三方Jar包
Android Studio的使用导入第三方Jar包
12 1
|
1月前
|
算法 编译器 程序员
深入理解C++编译模式:了解Debug和Release的区别
深入理解C++编译模式:了解Debug和Release的区别
62 2
|
1月前
|
算法 编译器 C++
【C++ 泛型编程 中级篇】C++ 编译时技术:探索 if constexpr 和 std::enable_if
【C++ 泛型编程 中级篇】C++ 编译时技术:探索 if constexpr 和 std::enable_if
40 0
|
1月前
|
安全 算法 编译器
【C++ 静态断言的技巧】掌握C++中static_assert的力量:深入探讨编译时检查
【C++ 静态断言的技巧】掌握C++中static_assert的力量:深入探讨编译时检查
42 1

推荐镜像

更多