编译脚本里定义的变量啥意思,怎么发挥作用的
export PATH=$PATH:/opt/toolchains/aarch64--glibc--stable-2020.08-1/bin
export TARGET_ARCH=aarch64
export TARGET_TRIPLE=aarch64-linux
export CROSS_COMPILE=$TARGET_TRIPLE-
export CC=$TARGET_TRIPLE-gcc
export CXX=$TARGET_TRIPLE-g++
export AS=$TARGET_TRIPLE-as
export LD="$TARGET_TRIPLE-ld --sysroot=$SDKTARGETSYSROOT"
export GDB=$TARGET_TRIPLE-gdb
export STRIP=$TARGET_TRIPLE-strip
export RANLIB=$TARGET_TRIPLE-ranlib
export OBJCOPY=$TARGET_TRIPLE-objcopy
export OBJDUMP=$TARGET_TRIPLE-objdump
export READELF=$TARGET_TRIPLE-readelf
export AR=$TARGET_TRIPLE-ar
export NM=$TARGET_TRIPLE-nm
export M4=m4
export ROS_DISTRO=galactic
以下是 全面总结 在使用 CMake 编译时涉及的 通用约定变量,涵盖环境变量与 CMake 内置变量,并明确其用途和分类:
一、核心工具链变量
1. 环境变量(由 Shell 设置,CMake 自动读取)
变量名 | 用途 | 对应 CMake 变量 | 示例值 |
---|---|---|---|
CC |
指定 C 编译器路径 | CMAKE_C_COMPILER |
export CC=clang |
CXX |
指定 C++ 编译器路径 | CMAKE_CXX_COMPILER |
export CXX=clang++ |
AR |
静态库归档工具(ar ) |
CMAKE_AR |
export AR=llvm-ar |
AS |
汇编器(as ) |
CMAKE_ASM_COMPILER |
export AS=llvm-as |
LD |
链接器(ld 或 lld ) |
CMAKE_LINKER |
export LD=ld.lld |
NM |
符号表查看工具(nm ) |
CMAKE_NM |
export NM=llvm-nm |
RANLIB |
静态库索引工具(ranlib ) |
CMAKE_RANLIB |
export RANLIB=llvm-ranlib |
STRIP |
去除二进制符号工具(strip ) |
CMAKE_STRIP |
export STRIP=llvm-strip |
OBJCOPY |
目标文件复制工具(objcopy ) |
CMAKE_OBJCOPY |
export OBJCOPY=llvm-objcopy |
OBJDUMP |
反汇编工具(objdump ) |
CMAKE_OBJDUMP |
export OBJDUMP=llvm-objdump |
READELF |
ELF 文件分析工具(readelf ) |
无直接对应,需手动配置 | export READELF=readelf |
二、交叉编译变量
1. 环境变量
变量名 | 用途 | 示例值 |
---|---|---|
CROSS_COMPILE |
工具链前缀(自动推导 AR 、CC 等路径) |
export CROSS_COMPILE=aarch64-linux- |
TARGET_ARCH |
目标架构(如 arm 、aarch64 ) |
export TARGET_ARCH=aarch64 |
TARGET_TRIPLE |
目标三元组(如 aarch64-linux-gnu ) |
export TARGET_TRIPLE=aarch64-linux |
2. CMake 变量
变量名 | 用途 | 示例值 |
---|---|---|
CMAKE_SYSTEM_NAME |
目标操作系统(Linux 、Android 等) |
-DCMAKE_SYSTEM_NAME=Linux |
CMAKE_SYSROOT |
目标系统根目录(sysroot) | -DCMAKE_SYSROOT=/opt/sysroot |
CMAKE_C_COMPILER_TARGET |
指定编译器目标三元组 | -DCMAKE_C_COMPILER_TARGET=aarch64-linux-gnu |
三、构建选项变量
1. 环境变量
变量名 | 用途 | 示例值 |
---|---|---|
CFLAGS |
C 编译选项 | export CFLAGS="-O2 -Wall" |
CXXFLAGS |
C++ 编译选项 | export CXXFLAGS="-std=c++17" |
LDFLAGS |
链接选项 | export LDFLAGS="-L/opt/lib -Wl,-rpath" |
CPPFLAGS |
预处理器选项(头文件路径等) | export CPPFLAGS="-I/opt/include" |
2. CMake 变量
变量名 | 用途 | 示例值 |
---|---|---|
CMAKE_BUILD_TYPE |
构建类型(Debug /Release ) |
-DCMAKE_BUILD_TYPE=Debug |
CMAKE_CXX_STANDARD |
C++ 标准版本(如 11 、17 ) |
-DCMAKE_CXX_STANDARD=17 |
CMAKE_EXPORT_COMPILE_COMMANDS |
生成编译数据库(用于工具集成) | -DCMAKE_EXPORT_COMPILE_COMMANDS=ON |
四、安装与路径控制
变量名 | 用途 | 示例值 |
---|---|---|
CMAKE_INSTALL_PREFIX |
安装目录前缀 | -DCMAKE_INSTALL_PREFIX=/opt/myapp |
CMAKE_PREFIX_PATH |
依赖库搜索路径(分号分隔) | -DCMAKE_PREFIX_PATH="/opt/qt5;/opt/boost" |
DESTDIR |
分阶段安装目录(覆盖实际安装路径) | export DESTDIR=/tmp/stage |
五、工具链工具示例
1. 使用 CROSS_COMPILE
自动推导工具链
export CROSS_COMPILE=aarch64-linux- export CC=${CROSS_COMPILE}gcc export CXX=${CROSS_COMPILE}g++ export AR=${CROSS_COMPILE}ar export LD=${CROSS_COMPILE}ld export NM=${CROSS_COMPILE}nm
2. CMake 显式指定工具链
set(CMAKE_C_COMPILER aarch64-linux-gcc) set(CMAKE_CXX_COMPILER aarch64-linux-g++) set(CMAKE_AR aarch64-linux-ar) set(CMAKE_NM aarch64-linux-nm)
六、特殊用途变量
变量名 | 用途 | 示例值 |
---|---|---|
PKG_CONFIG_PATH |
指定 pkg-config 搜索路径 |
export PKG_CONFIG_PATH=/opt/lib/pkgconfig |
ROS_DISTRO |
ROS 发行版标识(如 humble 、galactic ) |
export ROS_DISTRO=galactic |
SDKTARGETSYSROOT |
自定义 sysroot 路径(非标准变量) | export SDKTARGETSYSROOT=/opt/sdk |
七、总结
核心要点
- 工具链变量:
CC
、CXX
、AR
、NM
、LD
等是 环境变量,CMake 会将其转换为对应的CMAKE_*
内置变量。 - 交叉编译:通过
CROSS_COMPILE
或CMAKE_SYSROOT
定义目标平台环境。 - 构建控制:
CMAKE_BUILD_TYPE
和CMAKE_CXX_STANDARD
控制优化和语言标准。 - 路径管理:
CMAKE_INSTALL_PREFIX
和CMAKE_PREFIX_PATH
管理依赖和安装路径。
注意事项
- 优先级:CMake 命令行参数(
-D
) > 环境变量 > CMake 默认值。 - 清除缓存:修改编译器或工具链后,需删除
CMakeCache.txt
或使用--fresh
(CMake 3.24+)。
通过合理配置这些变量,可以覆盖从本地开发到嵌入式交叉编译的全场景需求。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
2023-02-12 交叉编译 configure