Linux虚拟机 CMakeLists.txt:x86 与 ARM 双架构编译脚本

简易 CMakeLists.txt

复制代码
cmake_minimum_required (VERSION 3.5)
project (HelloWorld)

# 生成编译数据库(帮助编辑器理解代码)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

# -Werror -Wreturn-type -Wextra
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++14")

# 根据构建类型 自动选择 优化级别,-g:生成调试信息
if(CMAKE_BUILD_TYPE STREQUAL "Release")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2")
else()
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -g")
endif()

include_directories(${PROJECT_SOURCE_DIR}/include)

set (source_dir "${PROJECT_SOURCE_DIR}/src/")
file (GLOB source_files "${source_dir}/*.cpp")

add_executable (${PROJECT_NAME} ${source_files})

# 打印编译器信息(便于调试)
message(STATUS "C Compiler: ${CMAKE_C_COMPILER}")
message(STATUS "CXX Compiler: ${CMAKE_CXX_COMPILER}")

脚本 build-x86.sh ,生成 x86 C/C++ 可执行程序

复制代码
#!/bin/bash

# x86架构 构建目录
BUILD_DIR=build_x86

# 清理并构建
rm -rf ${BUILD_DIR}
mkdir ${BUILD_DIR}
cd ${BUILD_DIR}

# 使用系统x86编译器, 模式: Debug/Release
cmake .. \
    -DCMAKE_C_COMPILER=/usr/bin/gcc \
    -DCMAKE_CXX_COMPILER=/usr/bin/g++ \
    -DCMAKE_BUILD_TYPE=Release

make -j$(nproc)

脚本 build-arm.sh,生成 ARM C/C++ 可执行程序

复制代码
#!/bin/bash
ARM_GCC=/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
ARM_GXX=/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++

# 检查 arm 编译器是否存在
if [ ! -f "$ARM_GCC" ]; then
    echo "Error: ARM C compiler not found: $ARM_GCC"
    exit 1
fi

if [ ! -f "$ARM_GXX" ]; then
    echo "Error: ARM C++ compiler not found: $ARM_GXX"
    exit 1
fi

# ARM架构 构建目录
BUILD_DIR=build_arm
# 清理并构建
rm -rf ${BUILD_DIR}
mkdir ${BUILD_DIR}
cd ${BUILD_DIR}

# 使用 ARM 交叉编译器, 模式: Debug/Release
cmake .. \
    -DCMAKE_C_COMPILER=$ARM_GCC \
    -DCMAKE_CXX_COMPILER=$ARM_GXX \
    -DCMAKE_C_COMPILER_FORCED=ON \
    -DCMAKE_CXX_COMPILER_FORCED=ON \
    -DCMAKE_BUILD_TYPE=Release

make -j$(nproc)
复制代码
# 安装 tree
sudo apt install tree
复制代码
# 显示目录结构
tree -L 2 --dirsfirst

几行代码的小文件,为什么编译后的可执行文件 变大数倍?我的 include 测试笔记:

复制代码
# 只预处理,不编译
g++ -E src/Main.cpp -I include

# 统计行数
g++ -E src/Main.cpp -I include | wc -l
# 你会看到几万行!

# 查看最后几行
g++ -E src/Main.cpp -I include | tail -20
复制代码
# 原始文件行数
cat src/Main.cpp | wc -l
复制代码
# 预处理后行数(包含 iostream)
g++ -E src/Main.cpp -I include | wc -l

查看编译后的汇编代码

复制代码
# 生成汇编文件(.s 文件)
g++ -S src/Main.cpp -I include -o Main.s

# 查看汇编代码
cat Main.s

代码:

复制代码
int fun(int a, int b)
{
    int ret;
    ret = a * b;
    return ret;
}

代码优化:

复制代码
int fun(int a, int b)
{
    return a * b;
}
相关推荐
山下梅子酒225几秒前
洛谷-入门-B2043
c语言
H_oRIZoN_9 分钟前
Linux入门DAY42【51 单片机】DS18B20 数字温度传感器完整解析(单总线原理 + 时序 + 读取流程)
linux·单片机·linux应用编程
j7~12 分钟前
【Linux网络加餐】(篇六)网络版计算器(上):模板方法模式、序列化与 JSON
linux·c++·json·序列化·反序列化·网络版计算机
weixin_3077791313 分钟前
C++代码实现MATLAB中的ode45函数功能
开发语言·c++·算法·matlab
张小姐的猫21 分钟前
【AI大模型接入SDK】 —— 数据管理 & 与Session模块进行联动
数据结构·数据库·c++·人工智能·python·chatgpt
流浪00137 分钟前
Linux系统篇34——信号(六):信号处理期间又来了怎么办?——sigaction、sa_mask、可重入函数与 volatile
linux·运维·面试·操作系统·信号处理·信号
学烹饪的小胡桃1 小时前
资产设备管理系统 WGFIX 怎么设置https访问
linux·运维·服务器·网络·安全
東隅已逝,桑榆非晚1 小时前
vector(模拟实现)
c++·笔记·学习
星源~1 小时前
MCU-OTA升级的flash分散加载应用
单片机·嵌入式·ota·flash分散加载
邪修king1 小时前
Re:Linux系统篇(二十六):文件系统(二):Ext 文件系统底层详解:从 inode、块组到软硬链接,结合 Windows 讲透文件管理本质
android·java·linux