【CMake】CMake从入门到实战系列(十六)—— CMake中设置交叉编译

news2024/7/6 19:52:41

文章目录

      • 一、前言
      • 二、切换编译器的方法
        • 1、修改系统环境变量来指定编译器
        • 2、CMake命令行中指定编译器
        • 3、CMakeLists.txt中指定编译器
        • 4、示例

一、前言

CMake是一个强大的跨平台的编译工具,实际嵌入式开发过程中,经常需要使用到交叉编译。在Ubuntu环境中,CMake如果不设置交叉编译,默认情况下,会使用Ubuntu系统(运行 cmake 命令的操作系统)的编译器来编译我们的工程,那么得到的可执行文件或库文件只能在 Ubuntu 系统运行。

如果我们需要使得编译得到的可执行文件或库文件能够在ARM 平台上运行,则需要配置交叉编译,这时就要将系统默认编译器切换到相对应的平台的编译器。例如,同一套代码编译出的执行文件,在海思平台上运行,则需要使用海思的交叉编译工具编译出对应的执行文件,在君正上运行,则需要使用君正的交叉编译工具编译出对应的执行文件。

二、切换编译器的方法

切换编译器有以下几种方法:

1、修改系统环境变量来指定编译器

可以在运行cmake命令之前设置系统环境变量来指定编译器。例如:

export CC=<C编译器> CXX=<C++编译器>

<C编译器>和<C++编译器>为有效的编译器名称或者指定完整路径。
将编译器的路径添加到系统的PATH环境变量中,可以使你在命令行中直接使用编译器的名称而不需要指定完整路径。

2、CMake命令行中指定编译器

可以在运行cmake命令时通过-D选项来指定编译器。例如:

cmake -DCMAKE_C_COMPILER=<C编译器> -DCMAKE_CXX_COMPILER=<C++编译器>

<C编译器>和<C++编译器>为有效的编译器名称或者指定完整路径。
将编译器的路径添加到系统的PATH环境变量中,可以使你在命令行中直接使用编译器的名称而不需要指定完整路径。

3、CMakeLists.txt中指定编译器

使用set命令在CMakeList.txt设置指定编译器。例如:

set(CMAKE_C_COMPILER “C编译器”)
set(CMAKE_CXX_COMPILER “C++编译器”)

C编译器和C++编译器为有效的编译器名称或者指定完整路径。
将编译器的路径添加到系统的PATH环境变量中,可以使你在命令行中直接使用编译器的名称而不需要指定完整路径。

4、示例

目录结构

project
  ├── CMakeLists.txt
  └── main.c

main.c源码

#include <stdio.h>

int main(int argc, char* argv[])
{
	printf("hello world\n");
	return 0;
}

CMakeLists.txt源码

cmake_minimum_required(VERSION 3.10)
project(Demo)

add_executable(app main.c)

下面用系统默认编译器以及上面总结的三种方法切换编译器进行编译,看一下结果
【1】系统默认编译器gcc编译
在这里插入图片描述
通过file命令查看编译出的执行文件属性,x86_64表示该文件是为 64 位 x86 架构编译的。这对于确保软件兼容性和性能优化非常重要。如果你在一个 x86_64 系统上运行程序,确保它们也是为 x86_64 架构编译的。

【2】修改系统环境变量
在这里插入图片描述
通过file命令查看编译出的执行文件属性,ARM表示该文件是为 ARM 架构编译的。

【3】CMake命令行中指定编译器
在这里插入图片描述
通过file命令查看编译出的执行文件属性,ARM表示该文件是为 ARM 架构编译的。

【4】CMakeLists.txt中指定编译器
修改CMakeLists.txt内容

cmake_minimum_required(VERSION 3.10)
project(Demo)

set(CMAKE_C_COMPILER "arm-anykav500-linux-uclibcgnueabi-gcc")
set(CMAKE_CXX_COMPILER "arm-anykav500-linux-uclibcgnueabi-g++")
add_executable(app main.c)

在这里插入图片描述
通过file命令查看编译出的执行文件属性,ARM表示该文件是为 ARM 架构编译的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1818173.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux中: IDEA 由于JVM 设置内存过小,导致打开项目闪退问题

1. 找到idea安装目录 由于无法打开idea&#xff0c;只能找到idea安装目录 在linux(debian/ubuntu)中idea的插件默认安装位置和配置文件在哪里? 默认路径&#xff1a; /home/当前用户名/.config/JetBrains/IntelliJIdea2020.具体版本号/options2. 找到jvm配置文件 IDEA安装…

Visual Studio编译fatal error C1001: 编译器中发生内部错误

项目本来是能正常编译的&#xff0c;但是突然出现“fatal error C1001: 编译器中发生内部错误。” 2> (编译器文件“f:\dd\vctools\compiler\utc\src\p2\main.c”&#xff0c;第 255 行) 2> 要解决此问题&#xff0c;请尝试简化或更改上面所列位置附近的程序。 2> …

AI大模型的战场 通用大模型 vs. 垂直大模型

目录 前言1 通用大模型1.1 通用大模型简介1.2 通用大模型的优势1.3 通用大模型的挑战 2 垂直大模型2.1 垂直大模型简介2.2 垂直大模型的优势2.3 垂直大模型的挑战 3 通用大模型 vs. 垂直大模型3.1 技术层面的比较3.2 商业层面的比较3.3 未来的发展趋势 结语 前言 随着人工智能…

直播预约丨《指标体系建设实战》第三期:指标平台功能架构及落地实践

指标是反映企业的各项核心业务活动、管理成效的数据体系&#xff0c;指标体系作为联结业务逻辑与数据实体的关键桥梁&#xff0c;是构建高质量数据统计的基础单元&#xff0c;并在量化业务绩效和效果评估中扮演着核心角色。 为了更好地服务于客户并提供切实可行的实践指导&…

idea插件开发之通过纯编码方式开发页面(不使用form ui)

写在前面 本文看线如何通过纯编码方式来定义页面。 1&#xff1a;正戏 我们首先来定义一个面板&#xff0c;需要继承抽象类&#xff1a;com.intellij.openapi.ui.SimpleToolWindowPanel&#xff0c;如下&#xff1a; public class MySelfDefinePanel extends SimpleToolWin…

NSS题目练习9

[极客大挑战 2020]welcome 界面打开后一片空白&#xff0c;查看题目描述&#xff0c;翻译过来是 1.除了GET请求方法&#xff0c;还有一种常见的请求方法… 2.学习一些关于sha1和array的知识。 3.更仔细地检查phpinfo&#xff0c;你会发现标志在哪里。 补充&#xff1a; sh…

模拟电子之电子管

如果要实现一个放大器的功能&#xff0c;需要一个固定的放大倍数&#xff08;Gain&#xff09;&#xff0c;这也就是说输出信号应该是跟随输入信号变化而变化&#xff0c;换句话说输出信号应该要受到输入信号的控制。 在电子学中使用的最多的两个物理量就是电压和电流&#xf…

(四)React组件、useState、组件样式

1. 组件 1.1 组件是什么 概念&#xff1a;一个组件就是用户界面的一部分&#xff0c;它可以有自己的逻辑和外观&#xff0c;组件之间可以相互嵌套&#xff0c;也可以复用多次。 组件化开发可以让开发者像搭积木一样构建一个完整的庞大应用 1.2 React组件 在React中&#xf…

【设计模式深度剖析】【7】【行为型】【观察者模式】

&#x1f448;️上一篇:中介者模式 设计模式-专栏&#x1f448;️ 文章目录 观察者模式英文原文直译如何理解&#xff1f; 观察者模式的角色类图代码示例 观察者模式的应用观察者模式的优点观察者模式的缺点观察者模式的使用场景 观察者模式 观察者模式&#xff08;Observer…

【React】配置别名路径@

别名路径配置 1. 路径解析配置&#xff08;webpack&#xff09; CRA本身把webpack配置包装到了黑盒里无法直接修改&#xff0c;需要借助一个插件 - craco步骤 安装craco npm i -D craco/craco项目根目录下创建配置文件 craco.config.js配置文件中添加路径解析配置 const pa…

Android低代码开发 - 直接创建一个下拉刷新列表界面

看了我Android低代码开发 - 让IDE帮你写代码这篇文章的小伙伴&#xff0c;大概都对Dora全家桶开发框架有基本的认识了吧。本篇文章将会讲解如何使用dora-studio-plugin快捷创建一个下拉刷新列表界面。 效果演示 这样直接通过图形界面的方式就创建好了下拉刷新上拉加载空态界面…

3. 打造个性化可爱怪物表情包:详细步骤教学

表情符号已经成为当今互联网对话中不可或缺的元素&#xff0c;一句话加上一个笑脸符号&#xff0c;语气就大不同。表情符号与我们一道稳步发展&#xff0c;成为鲜活和丰富情感的必要交流工具。通过表情符号&#xff0c;几个像素就能以有趣、清晰、能引起情感共鸣的方式表达我们…

d3dcompiler_43.dll是什么文件?怎么高效率的解决d3dcompiler_43.dll丢失问题

d3dcompiler_43.dll是什么文件&#xff1f;当你知道d3dcompiler_43.dll这个文件名字的时候&#xff0c;相信你是遇到了d3dcompiler_43.dll丢失的问题了&#xff01;所以才会这样问&#xff0c;其实这就是一个普通的dll文件&#xff0c;对于电脑系统有着至关重要的作用&#xff…

100v 高耐压ldo 高压三端稳压芯片

100v 高耐压ldo 高压三端稳压芯片

【Android 11】AOSP Settings添加屏幕旋转按钮

前言 这里是客户要求添加按钮以实现屏幕旋转。屏幕旋转使用adb的命令很容易实现&#xff1a; #屏幕翻转 adb shell settings put system user_rotation 1 #屏幕正常模式 adb shell settings put system user_rotation 0这里的值可以是0&#xff0c;1&#xff0c;2&#xff0c…

pyinstaller打包exe多种失败原因解决方法

pyinstaller打包exe多种失败原因解决方法 目录 pyinstaller打包exe多种失败原因解决方法1、pyinstaller安装有问题1.1 安装pyinstaller1.2 采用anconda的环境启动 2、pyqt5与pyside6冲突2.1 打包生成.spec文件2.2 编辑spec文件 3、打包成功后打不开exe&#xff0c;exe闪退3.1 s…

网格重构技术在AI绘画中的革新作用

引言&#xff1a; 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;艺术创作也迎来了前所未有的变革。AI绘画不仅改变了艺术家的创作方式&#xff0c;还为非专业人士开启了艺术创作的大门。在众多AI技术中&#xff0c;网格重构技术因其独特的作用和效果成为A…

【CH32V305FBP6】USBD HS 中断分析

文章目录 前言中断分析 USBHS_IRQHandler传输完成&#xff1a;USBHS_UIF_TRANSFERTOKEN_IN&#xff1a;发送完成TOKEN_OUT&#xff1a;接收完成 描述符&#xff1a;USBHS_UIF_SETUP_ACT总线复位&#xff1a;USBHS_UIF_BUS_RST总线挂起&#xff1a;USBHS_UIF_SUSPEND 前言 所有…

图文解析ASN.1中BER编码:结构类型、编码方法、编码实例

本文将详细介绍ASN.1中的BER编码规则&#xff0c;包括其编码机制、数据类型表示、以及如何将复杂的数据结构转换为二进制数据。通过本文的阅读&#xff0c;读者将对ASN.1中的BER编码有一个全面的理解。 目录 一.引言 二.BER编码基本结构 ▐ 1. 类型域&#xff08;Type&#…

光伏气象站:智能驱动,助力光伏产业绿色发展

TH-FGF9在全球能源结构转型和环境保护的大背景下&#xff0c;分布式光伏发电以其清洁、可再生的特性&#xff0c;逐渐成为了能源领域的新宠。然而&#xff0c;光伏发电的效率受气象条件影响较大&#xff0c;如光照强度、温度、风速等因素都会对光伏电站的发电效率产生直接影响。…