使用CMAKE和交叉编译工具链

记录使用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简介及使用,基础食用很香,配合使用极佳!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cap reagan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值