linux下cmake编译64位,32位,ARM,ARM64程序

news/2024/10/11 11:49:11/

准备工作

gnu提供不同平台的编译工具,为同一平台打造不同的程序提供条件,它可以提供64位,32位,x86与arm平台编译.
本次测试环境为 debian 6.1 x86_64系统,当测试时我们需要安装以下环境:

安装基本依赖

sudo apt install module-assistant build-essential

安装x64位gcc/g++
系统为64位系统默认安装了64位gcc, 但如果没有安装则可以按照下面进行安装

sudo apt install gcc g++
gcc --version
g++ --version

安装x86 32位gcc/g++
在64位系统中需要编译32位程序则需要安装gcc-multilib与g+±multilib

sudo apt install gcc-multilib g+±multilib
gcc -m32 --version
g++ -m32 --version

安装arm 32位gcc/g++
gnu的arm 32工具链有 gcc-arm-linux-gnueabihf与g+±arm-linux-gnueabihf

sudo apt install gcc-arm-linux-gnueabihf g+±arm-linux-gnueabihf
arm-linux-gnueabihf-gcc --version
arm-linux-gnueabihf-g++ --version

安装arm 64(aarch64)位gcc/g++
gnu的arm 64工具链有 gcc-aarch64-linux-gnu与g+±aarch64-linux-gnu:

sudo apt install gcc-aarch64-linux-gnu g+±aarch64-linux-gnu
aarch64-linux-gnu-gcc --version
aarch64-linux-gnu-g++ --version

cmake配置编译不同平台程序

CMakeLists.txt配置

编译32位程序
cmake可以通过CMakeLists.txt文件配置在64位系统中编译32位程序,可以在CMakeLists.txt文件中增加以下语句:

set(GCC_COVERAGE_COMPILE_FLAGS "-m32")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}")

编译arm32程序
cmake可以通过CMakeLists.txt文件配置使用编译工具链,以便在x86_64的系统中编译arm,可以在CMakeLists.txt文件中增加以下语句:

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)

编译arm64(aarch64)程序
CMakeLists.txt文件配置使用编译工具链gcc-aarch64-linux-gnu与g+±aarch64-linux-gnu以便编译aarch64程序,可以在CMakeLists.txt文件中增加以下语句:

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)

以上为使用CMakeLists.txt修改配置完成不同版本程序编译配置.

cmake命令行设置

cmake命令行可以通过-D参数实现上面的变量配置,与CMakeLists.txt实现方式完全相同,因而可以参照上面的配置修改命令来达到不同版本程序,以下以opencv编译为例说明
编译32位程序

cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=./bin -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.x/modules -DWITH_GTK=ON -DWITH_GTK_2_X=ON -DCMAKE_C_FLAGS="${CMAKE_C_FLAGS} -m32" -DCMAKE_CXX_FLAGS="${CMAKE_CXX_FLAGS} -m32"  ..

编译arm32程序

cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=./bin -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.x/modules -DWITH_GTK=ON -DWITH_GTK_2_X=ON -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=arm -DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc  -DCMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ ..

编译arm64(aarch64)程序

cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=./bin -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.x/modules -DWITH_GTK=ON -DWITH_GTK_2_X=ON -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=aarch64 -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc  -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ ..

PS:网上有人说可以使用以下方式编译32或64位程序,但我没有试验成功:
x86

cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=./bin -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.x/modules -DWITH_GTK=ON -DWITH_GTK_2_X=ON -DCMAKE_GENERATOR_PLATFORM=X86  ..

x64

cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=./bin -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.x/modules -DWITH_GTK=ON -DWITH_GTK_2_X=ON -DCMAKE_GENERATOR_PLATFORM=X64  ..

http://www.ppmy.cn/news/1537436.html

相关文章

ChatGPT背景下,高职人工智能技术应用专业的人才培养

一、引言 ChatGPT,即聊天生成预训练变换器,由美国OpenAI公司开发,自2022年11月首次亮相以来,已成为人工智能领域的一个标志性成就。这款聊天机器人利用先进的人工智能技术,处理自然语言,能够精准把握用户的…

基于STM32设计的生猪健康检测管理系统(NBIOT+OneNet)(240)

文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成1.2 设计思路1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】项目背景【5】摘要1.4 开发工具的选择【1】设备端开发【2】上位机开发1.5 系统功能总结1.6 系统框架图…

探索基于基于人工智能进行的漏洞评估的前景

根据2023年的一份报告 网络安全企业据估计,到 10.5 年,网络犯罪每年将给世界造成 2025 万亿美元的损失。每年记录在案的网络犯罪数量都会创下新高。这要求对传统的安全测试流程进行重大改变。这就是漏洞评估发挥作用的地方。 漏洞评估对于识别系统中的弱…

研发中台拆分之路:深度剖析、心得总结与经验分享

背景在 21 年,中台拆分在 21 年,以下为中台拆分的过程心得,带有一定的主观,偏向于中小团队中台建设参考(这里的中小团队指 3-100 人的团队),对于大型团队不太适用,毕竟大型团队人中 …

Github优质项目推荐 - 第六期

文章目录 Github优质项目推荐 - 第六期一、【WiFiAnalyzer】,3.4k stars - WiFi 网络分析工具二、【penpot】,33k stars - UI 设计与原型制作平台三、【Inpaint-Anything】,6.4k stars - 修复图像、视频和3D 场景中的任何内容四、【Malware-P…

搭建jacoco检测代码覆盖率

一、前言 前两天突然看到了这个jacoco,想着搭建了可以查看功能测试覆盖率和自动化脚本的覆盖率。 然后简单的研究了一下怎么使用和搭建。 二、准备 1、官网下载:jacoco 2、ruoyi前后端不分离版本 三、开始 1、服务器先配置java运行环境 2、然后打…

黑马javaWeb笔记重点备份2:mybatis基础(注解方式)、数据库连接池概念、lombok使用

以下均来自:【黑马程序员JavaWeb开发教程,实现javaweb企业开发全流程(涵盖SpringMyBatisSpringMVCSpringBoot等)】 https://www.bilibili.com/video/BV1m84y1w7Tb/?p75&share_sourcecopy_web&vd_source9332b8fc5ea8d349a…

汽车网关(GW)技术分析

一、引言 在现代汽车电子系统中,汽车网关(Gateway,简称 GW)扮演着至关重要的角色。随着汽车电子技术的不断发展,汽车内部的电子控制单元(Electronic Control Unit,简称 ECU)数量不断…