记录使用CMake过程中的一段CMakeLists.txt的代码以及交叉编译脚本cross.cmake的代码。

文章目录

  • 一、CMakeLists.txt
  • 二、cross.cmake
  • 总结

提示:代码中包含了解释和使用提示,可直接使用。


一、CMakeLists.txt

cmake_minimum_required(VERSION 3.5)  #最低应用版本
#cross compile option (ON/OFF) 开启交叉编译的
option(BUILD_RK3588 "Whether or not to use the cross tools"  ON) #宏定义开关
if(BUILD_RK3588)  #选择语句include(./cross.cmake)  #包含.cmake脚本
endif()
project(ADC)   #创建工程
aux_source_directory(${PROJECT_SOURCE_DIR} SOURCE_FILE)   #参数之间空格隔开,命令不分大小写,参数分大小写, 提取当前文件下源文件列表赋给变量SOURCE_FILE
#设置C/C++ 编译的参数(根据需要自己设置)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
set(CMAKE_CXX_FLAGS " -o -Wall -pthread -g -lm -ldl  -DLINUX_OS -lstdc++fs -fpermissive -pipe -fPIC -ffunction-sections ${CMAKE_CXX_FLAGS}")
add_executable(adc_test ${SOURCE_FILE})  #用于指定从一组源文件 source1 source2 … sourceN 编译出一个可执行文件且命名为 adc_test
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/bin)   #用于输出可执行文件输出路径#CMAKE_CXX_FLAGS这种大写的变量,一般都是CMake预定义的内建变量,且他们是全局的。该变量可用于设置编译选项。直接使用set修改其值即可。
#除了修改该变量的值之外,还可以通过add_compile_options命令来设置编译选项。它们的区别是:
#add_compile_options命令添加的编译选项是针对所有编译器的(包括c和c++编译器),CMAKE_C_FLAGS或CMAKE_CXX_FLAGS变量则是分别只针对c和c++编译器

二、cross.cmake

代码如下(示例):

# Indicate cross-compilation 定义CMAKE_SYSTEM_NAME后将自动设置为TRUE
SET(CMAKE_CROSSCOMPILING true)
# Indicate target operate system   这是必需的,它是目标系统的名称,构建的目标平台
SET(CMAKE_SYSTEM_NAME Linux)
# Indicate architecture  目标系统的可选,处理器(或硬件)。要构建的目标架构
SET(CMAKE_SYSTEM_PROCESSOR arm)# Indicate toolchain path  设置编译工具链路径
SET(TOOLCHAIN_DIR "/opt/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu")# The first search path  这是一个目录列表,其中列出的每个目录都将被添加到每个FIND_XXX()命令的每个搜索目录中。
SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR})   #指定交叉编译环境的目录 , 指定交叉编译环境安装目录…
# The second search path CMAKE_SYSROOT只有在3.0以上的版本才有效,指定编译器--sysroot编译参数,变量也可以用来指定一个目录作为搜索目录前缀
SET(CMAKE_SYSROOT  ${TOOLCHAIN_DIR}/aarch64-none-linux-gnu/libc) #默认先搜索CMAKE_FIND_ROOT_PATH,之后搜索CMAKE_SYSROOT,最后搜索其他non-rooted路径# C/C++ compiler path 编译器可执行文件,可以是完整路径,也可以只是文件名
SET(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/aarch64-none-linux-gnu-gcc)
SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/aarch64-none-linux-gnu-g++)# The install path 为Cmake内置变量,用于指定Cmake执行install目标时,安装的路径前缀
SET(CMAKE_INSTALL_PREFIX   ${CMAKE_SYSROOT}/libc/usr)#从来不在指定目录下查找工具程序
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)  #在大多数情况下,需要构建主机的可执行文件,因此通常将CMAKE_FIND_ROOT_PATH_MODE_PROGRAM设置为NEVER。
#只在指定目录下查找库文件
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)  #在大多数情况下,这用于查找将用于链接的库,因此需要用于目标的库。因此,在常见情况下,将其设置为ONLY。
#只在指定目录下查找头文件
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)  #在许多情况下,这用于查找包含目录,因此应搜索目标环境。因此,在常见情况下,将其设置为ONLY。您可能必须使用
#设置C++ 编译的参数(根据需要自己设置)
set(CMAKE_CXX_FLAGS "-o -Wall -g -lm -ldl  -DLINUX_OS  -fpermissive -pipe -fPIC -ffunction-sections ${CMAKE_CXX_FLAGS}")
#使用一对双引号包裹的被认为是一个参数
# -Wall       :  编译时显示警告信息
# -O          : 选择编译器优化的级别,-O0 不优化  -O1 -O2 -O3 不同程度的优化
# -g          :  生成调试信息,debug会用到。调试信息的级别。-g3
#               尽可能的生成gdb的可以使用的调试信息。默认为-g2。信息越多,编译出的程序越大。
# -std=c++11  : 编译所按照C++的标准
# -fmessage-length=0 :输出信息会根据控制台的宽度自动换行,这样就能看全输出信息了
# -fPIC       : 作用于编译阶段,告诉编译器产生与位置无关代码
#               (Position-Independent Code)。加载到任意位置都能执行
# -DTEST     : 设置TEST的宏定义,另外一种设置宏定义的方式可以直接使用 add_definitions(-D TEST) 添加
# -fpermissive  : 该选项会将不一致代码的诊断从错误降级为警告。

勤使用,才能掌握~!


总结

参考太多文章,都在收藏里了。
其中有一个令我受益匪浅:CMake简介及使用,基础食用很香,配合使用极佳!

使用CMAKE和交叉编译工具链相关推荐

  1. 基于CMake的交叉编译工具链配置问题总结

    在近期的工作中,因项目自动化测试需要,大量单元测试构建需要通过脚本来完成.然而目前的项目中编译器是基于GCC较老版本修改而来,因此并不能很好地支持目前的开源测试框架googletest.而且基于性能的 ...

  2. cmake:ESP32交叉编译工具链定义

    ESP32的SDK(ESP-IDF)本身提供了esp32平台的cmake toolchain文件: esp-idf-v4.4\tools\cmake\toolchain-esp32.cmake 1就是 ...

  3. cmake:基于MDK(Keil)的Nationstech.N32G45x平台交叉编译工具链定义

    Keil MDK是非常常用的单片机开发集成环境,Keil公司2005年由ARM公司收购,现在是ARM主要的嵌入系统开发平台(ARM的另一个开发环境ds-5早在九年前就停止更新了). Keil虽然是个集 ...

  4. Mastering Embedded Linux Programming 学习 (一)嵌入式交叉编译工具链的构建,基于crosstool-NG

    Mastering Embedded Linux Programming 学习 (一) 一.ubuntu 软件包下载 sudo apt install autoconf automake bison ...

  5. 自己动手安装ARM交叉编译工具链

    一,首先说一下在linux中安装软件的特点: 相比windows下安装要稍显复杂,linux中安装一般有以下几种方法: 1.在线安装,譬如ubuntu中使用apt-get install vim 来安 ...

  6. arm-linux交叉编译工具链的制作(基于S3C2440)【转】

    本文转载自:http://eric-gao.iteye.com/blog/2160622 制作arm-linux交叉编译工具链一般通过crosstool工具或者crosstool-NG,前者使用方便, ...

  7. linux centos7 使用 crosstool-ng 构建 交叉编译 工具链 即构建各cpu架构平台的gcc编译器

    简介 crosstool-ng,全称是crosstool Next Generation,即下一代crosstool.crosstool是个交叉编译器的制作工具,但是做的不够好,于是有人(Yann E ...

  8. 使用 Android NDK 的交叉编译工具链移植 C/C++ 项目到安卓平台

    什么是 NDK? Android NDK 是一套可以让开发者在安卓应用开发中使用 C/C++ 实现特定模块的工具集,不是所有应用都需要用到,但是正确地使用可以有效提高应用运行效率和安全性. 为什么要在 ...

  9. arm-buildroot-linux-,buildroot构建交叉编译工具链,根文件系统

    支持多种处理器,arch,avr32,mips,x86等等,在arch/目录可查看. buildroot可使用make menuconfig进行配置,选择需要编译到目标文件系统的包,相关的配置文件在c ...

最新文章

  1. a prefect storm歌词_Storm s Perfect Storm歌词
  2. 机器学习常用损失函数总览:基本形式、原理、特点
  3. python主要用于后端开发还是前端,Django是用于前端还是后端?
  4. 监控Tomcat解决方案(监控应用服务器系列文章分享)
  5. [2021-09-04 AtCoder Beginner Contest 217] 题解
  6. GCC + pthread
  7. NLP将迎来黄金十年,7个案例带你入门(附Python代码)
  8. PostgreSQL的时间/日期函数使用
  9. pandas pivot 计算占比_pandas使用9:如何处理时间序列数据
  10. matlab三维矩阵_Matlab绘制三维表面模型说明
  11. 《C++ Primer Plus(第6版)中文版》——1.2 C++简史
  12. 190530每日一句
  13. Matlab的循环语法
  14. Radon变换理论介绍
  15. html中怎么设置表格自动换行在哪里,【HTML】表格自动换行
  16. 范数和条件数(Norms and Condition Numbers)
  17. 「技巧」如何快速安装 Sketch 插件
  18. 目前商店巡店督导遇到的问题要怎么管理
  19. Android实现3DTouch效果
  20. 嵌入式学习:裸机开发_L4_官方SDK开发LED实验

热门文章

  1. 【HBase】关于包org.apache.hadoop.hbase.client
  2. Graboid蠕虫挖矿传播事件
  3. Excel 2010 VBA 入门 081 数据处理之获取不重复的数据
  4. 蚂蚁课堂视频笔记思维导图-3期 一、并发编程专题
  5. 【MCAL_CANDriver】-1.2-Can Mailbox邮箱,Hardware Object,HOH,HRH,HTH之间的关系
  6. Redis - RedisClient
  7. python 矩阵输出
  8. Cornerstone的分支问题Merge dry run failed: working copy is too old
  9. java float转换_Java float转换为String
  10. uniapp uview-ui退出登录后重新登录token不是最新的解决方案