0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux下如何编译C程序?

Q4MP_gh_c472c21 来源:嵌入式大杂烩 2020-09-20 10:56 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Windows下常用IDE来编译,Linux下直接使用gcc来编译,编译过程是Linux嵌入式编程的基础,也是嵌入式高频基础面试问题。

一、命令行编译及各个细分编译过程

hello.c示例代码:

#include intmain(void) { printf("Helloworld "); return0; }

编译:

gcchello.c-ohello

如有必要,还需回答出细分的几个步骤:

gcc-Ehello.c-ohello.i#预处理阶段 gcc-Shello.i-ohello.s#编译阶段 gcc-chello.s-ohello.o#汇编阶段 gcchello.o-ohello#链接阶段

具体细节可查往期笔记:《C程序编译过程》

二、借助make来编译

少量文件时可以使用上面方法编译。源码文件较多时,可借用make工具。make通过解析Makefile文件来执行一些gcc命令进行编译。

首先得创建一个Makefile文件,如:

hello:hello.c gcchello.c-ohello

编译运行:

上面更细分编译过程的Makefile文件如下:

关于make及Makefile更多内容可查阅:

【Linux笔记】make工程管理工具(一)

【Linux笔记】make工程管理工具(二)

三、借助CMake生成Makefile

实际开发很少会像上面一样自己编写Makefile文件,可借助cmake工具来生成。

CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。

1、命令行操作

首先输入cmake --version命令查看cmake版本,若还没安装则执行如下命令安装:

sudoaptinstallcmake

下面开始实验演示。我们的cmake_test文件夹下有一个hello.c文件,在同文件夹下创建一个 CMakeLists.txt 文件:

输入如下内容:

cmake_minimum_required (VERSION 3.10.2) project (cmake_test) add_executable(cmake_test hello.c)

然后在cmake_test目录下依次输入如下命令生成Makefile文件:

mkdirbuild#创建build文件夹 cdbuild#进入build文件夹 cmake../#在cmake_test文件夹下生成Makefile

执行结果如下:

关于CMakeLists.txt文件具体语法感兴趣的朋友可自行查阅资料进行学习。

2、使用cmake-gui

上述是在命令行下使用cmake生成Makefile进行进行编译的方法。我们也可以使用图形化界面来生成Makefile文件。cmake-gui是cmake的一个图形化工具。下面依旧以实例作为演示。

我们把上一小节的CMakeLists.txt 与hello.c文件放入新创建的文件夹cmake-gui_test中:

在终端输入 cmake-gui 命令启动cmake-gu图形化工具。若未安装可输入如下命令进行安装:

sudoaptinstallcmake-qt-gui

如:

启动cmake-gui:

查看cmake-gui_test文件夹:

编译运行:

以上分享了一些编译的过程及方法,都是基础内容,需要熟练掌握。如果觉得文章对你有帮助,欢迎转发。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5212

    文章

    20763

    浏览量

    338792
  • Linux
    +关注

    关注

    88

    文章

    11854

    浏览量

    219830
  • C程序
    +关注

    关注

    4

    文章

    255

    浏览量

    37715

原文标题:还能这样用?Linux下如何编译C程序?

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Linux Kernel 6.1 tools目录全解析 | RK平台ARM64交叉编译实战指南

    、硬件测试等全场景能力。 本文完整拆解 Linux Kernel 6.1 tools 目录所有模块功能,并给出 RK 平台 ARM64 架构交叉编译的标准指令 ,一站式解决内核工具使用与编译问题,适合
    的头像 发表于 04-16 18:42 7767次阅读
    <b class='flag-5'>Linux</b> Kernel 6.1 tools目录全解析 | RK平台ARM64交叉<b class='flag-5'>编译</b>实战指南

    Linux扩充Swap交换空间:解决内存不足的实用指南,这些影响要注意!

    大家在使用 Linux 系统(比如常用的 Ubuntu)时,是不是偶尔会遇到 “内存不足” 的弹窗?比如运行大型编译任务、多开虚拟机、做数据分析,或者把 Linux 当服务器用的时候,物理内存一旦 “告急”,系统就会卡顿甚至崩溃
    的头像 发表于 02-09 16:33 671次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>下</b>扩充Swap交换空间:解决内存不足的实用指南,这些影响要注意!

    使用andrew的gentoo系统直接在VF2上编译linux-JH7110_VF2_6.6_v5.12.0时,编译报错怎么解决?

    当我尝试使用 andrew 的 gentoo 系统直接在 VF2 上编译 linux-JH7110_VF2_6.6_v5.12.0 时,我收到此错误并且编译停止。 In file included
    发表于 02-06 07:15

    Linux 开发嵌入式必备命令速查表

    在嵌入式开发中,Linux系统几乎成为必备的开发环境。不管你是在做STM32、RaspberryPi、还是基于ARM的板子,熟练掌握Linux命令不仅能加快开发效率,还能让你在调试、交叉编译、文件
    的头像 发表于 01-19 09:06 1117次阅读
    <b class='flag-5'>Linux</b> <b class='flag-5'>下</b>开发嵌入式必备命令速查表

    Linux Swap交换空间详解:Android编译内存不足?这样扩充立竿见影

        在  Linux  系统使用过程中,你是否遇到过  “ 内存不足 ”  的报错?比如编译  Android  源码时,明明按教程操作,却因物理内存没达到  16G  要求而编译中断?这正是
    的头像 发表于 12-06 08:10 4702次阅读

    别再迷糊了!Linux交叉编译到底是个啥?一文讲清楚

    很多工程师第一次听到“交叉编译”这4个字时,脑袋里往往会冒出两个字: 抽象 。 明明写代码写得好好的,为啥还要搞一个“交叉”?编译不就是把源代码变成可执行程序吗,难道还会绕几个弯? 别急,今天我们
    的头像 发表于 12-03 16:28 1397次阅读
    别再迷糊了!<b class='flag-5'>Linux</b>交叉<b class='flag-5'>编译</b>到底是个啥?一文讲清楚

    基于 DR1M90 的 Linux-RT 内核开发:从编译配置到 GPIO / 按键应用实现(1)

    本手册由创龙科技研发,针对 DR1M90,详述 Linux-RT 实时内核开发:含实时性测试(LinuxLinux-RT 对比、CPU 空载 / 满负荷 / 隔离状态测试)、内核配置编译
    的头像 发表于 12-02 10:38 1415次阅读
    基于 DR1M90 的 <b class='flag-5'>Linux</b>-RT 内核开发:从<b class='flag-5'>编译</b>配置到 GPIO / 按键应用实现(1)

    Linux 交叉编译实战:跑起来你的第一个 STM32 程序

    很多开发者第一次接触STM32,总会被“交叉编译”、“烧录程序”等概念绕晕。其实方法很简单:在Linux配置交叉编译环境,编写简单
    的头像 发表于 11-24 19:04 1174次阅读
    <b class='flag-5'>Linux</b> <b class='flag-5'>下</b>交叉<b class='flag-5'>编译</b>实战:跑起来你的第一个 STM32 <b class='flag-5'>程序</b>

    Linux系统编译C语言仿真蜂鸟E203(二)

    NUCLEI_TOOL_ROOT路径,便于编译的时候能够找到其路径的gcc工具链 NUCLEI_TOOL_ROOT=/home/ICer/Nuclei_Tools Nuclei_Tools文件夹下的gcc文件中
    发表于 10-24 13:38

    蜂鸟例程的编译程序的加载

    compile,编译run的文件,编译过程同样使用了riscv的toolchain;最后make run,使用VCS平台执行TESTCASE对应的仿真程序。 1.2 高级语言
    发表于 10-24 13:34

    rtsmart开启C++特性支持后,工具链编译内核不通过怎么解决?

    各位大佬好,本人在rtsmart项目中需要使用C++11特性,在menuconfig那里配置了支持C++特性后,使用7.3.0版本的arm-linux-musleabi编译
    发表于 09-29 07:49

    开发环境一键部署 | 如何搭建Docker环境编译ARM程序

    点:环境搭建为何如此关键?嵌入式Linux开发,环境是地基。传统方式,开发者往往需要:四处搜寻匹配的工具链版本手动配置复杂的编译参数多次反复适配环境耗费数日搭建
    的头像 发表于 08-15 11:06 1245次阅读
    开发环境一键部署 | 如何搭建Docker环境<b class='flag-5'>编译</b>ARM<b class='flag-5'>程序</b>?

    【HZ-T536开发板免费体验】2 - 交叉编译仓颉编程语言程序到开发板运行

    。 可以对前面的hello.cj进行一交叉编译: cjc test.cj --target aarch64-unknown-linux-gnu -o test1-B /usr
    发表于 07-16 21:27

    如何单独编译linux内核?

    那套sdk?纯linux sdk编译方法见readmehttps://github.com/kendryte/k230_linux_sdk/ make linux
    发表于 07-11 08:06

    linux使用cyusbserial SDK错误怎么解决?

    我使用的TI DLP3010EVM模块是通过CY7C65215 芯片进行控制的,我可以在win环境正常使用TI DLP的调试软件或者使用cyusbserial SDK的vs程序完成对设备的控制
    发表于 06-03 07:46