【Linux环境编程入门】三、第一个程序

Linux编程环境 Linux编程环境Linux环境下的编辑器Vim使用简介使用Vim建立文件使用Vim编辑文本Vim的格式设置Linux下的GCC环境编辑器Makefile文件简介用GDB调试程序 Linux环境下的编辑器 在Linux环境下有很多编译器,例如基于行的编辑器ed和ex, 基于文本的编辑器Vim、 Emacs等。使用文本编辑器可以帮助用户翻页、移动光标、查找字符、替换字符、删除等操作。本节中对Vim编辑器进行详细的介绍,并简单介绍其他的编辑器。 Vim使用简介 Vi 是UNIX系统下最通用的文本编辑器。Vi不是 阅读详情

本系列文章系本人原创,欢迎转载,转载请注明出处

一、第一个程序: Hello World!

注:这篇文章所建立的所有文件(源文件,库文件,可执行文件等)均可在这里下载。下载的是chapter3.tar.gz文件,可以在Linux系统终端中用如下命令解压到当前目录:

tar zxvf chapter3.tar.gz

我们现在开始编写我们在Linux系统上的第一个程序。我们先建立我们要存放程序的目录:

读者可以根据个人喜好建立相应的目录,下面是笔者演示用的目录(/home/test/LinuxProgrammingBasics/chapter3):
这里写图片描述

接下来我们就开始编写第一个程序了,这个程序就一个功能:在终端上输出”Hello World!”.
输入下面的命令以打开vim:

vim sayHello.c

进入vim后,按i进入编辑模式,输入下面的代码:

#include <stdio.h>
int main()
{
    printf("Hello World!\n");
    return 0;
}

然后按ESC键进入命令模式,再按:键进入末行模式,输入wq并回车以保存文件并退出到终端/命令行。
这里写图片描述

回到终端后,我们可以用ls命令查看到当前目录下已经有一个sayHello.c文件了。

输入下面的命令以产生可执行文件:

gcc -o sayHello sayHello.c

此时,如果可以用ls命令查看到当前目录下有两个文件:
1) 源文件: sayHello.c
2) 可执行文件: sayHello

在终端中输入下面的代码以执行该可执行文件:

./sayHello

这将会产生如下的输出:
这里写图片描述

至此,我们的第一个程序就编写并执行成功了。

二、关于gcc的简单介绍

1. gcc命令

我们先来看一下我们在上面这个例子中用来生成可执行文件的命令:

gcc -o sayHello sayHello.c

在这个命令中,一目了然的是sayHello.c,这个是我们的源文件,代码就存在着里。那么其他的是什么呢?
gcc: GNU的C语言编译器
-o sayHello: 指定生成的可执行文件的名字是sayHello。有兴趣的读者可以尝试将 “-o sayHello”中的 “sayHello”改成其他的名字试试。如果不使用-o,而直接使用 “gcc 源文件名”生成可执行文件的话,那么默认会生成名字为a.out的可执行文件:
这里写图片描述

2. 头文件和库文件

我们再看一下代码:

#include <stdio.h>
int main()
{
    printf("Hello World!\n");
    return 0;
}
头文件

我们可以看到在源代码中我们使用了printf函数,但是在我们的源代码中我们并没有定义printf函数,那么当我们执行gcc命令时,为什么没有提示任何异常呢?
答案是我们在源代码的最开始引入了头文件: stdio.h, printf函数的声明就在这个文件里,也就是说这个文件里规定了printf接受什么样的参数,返回什么类型的值之类的信息。

讲到这,我们发现我们只是在源代码中简单的使用了include命令将stdio.h引用进来了,并没有指出具体位置,并且在执行gcc命令生成可执行文件的时候也没有指明头文件的位置,那么gcc是在什么地方去找这个头文件的呢?
c语言的头文件几乎都位于/usr/include目录及其子目录中。gcc会自动的在这个目录下去找指定的头文件,所以我们在执行gcc的时候不用指定去哪里找stdio.h文件。

那么如果我们自己写了头文件或者需要使用其他的不在这个目录下的头文件的时候该怎么办呢?此时,我们就必须在执行gcc命令的时候自行指定头文件的位置了:

gcc .. -I{头文件所在目录} ...
库文件

回到stdio.h,我们已经知道它的位置了(/usr/include/stdio.h),但是我们打开它的话会发现这里面只有printf函数的声明,函数体并不在这里。也就是说只有只有源代码和头文件,还不能生成可执行文件,因为还缺少printf的函数体(即printf具体会做哪些操作)。这里缺的就是库文件。
库文件就是一组已经编译好的函数的集和。常用的库文件几乎都位于/lib或/usr/lib目录下(也可能是/lib64或/usr/lib64,视情况而定)。printf是标准c语言库的,所以gcc会自动的去到这个目录下找标准c语言库。我们可以通过下面的命令来查看我们的可执行文件用到了哪些库:

ldd sayHello

在笔者的电脑上输出如下:
这里写图片描述
其中libc.so.6就是标准c语言库,它位于/lib64目录下。

事实上gcc只会去找标准c语言库,那么如果我们需要用到其他的库怎么办呢?这个时候就需要在gcc命令中指定我们用到的库了:

gcc .. -L{库文件所在文件夹} -l{库文件} ..

这里需要注意的是 “-l{库文件}”并不是要传入完整的文件名,例如如果输入以下命令:

gcc .. -L{/home/test/bin} -l{math} ..

则会在 “/home/test/bin”目录下去找库文件 “libmath.a”或 “libmath.so”。
“.a”和 “.so”分别是静态库和共享库,可以简单的理解为如果生成可执行文件的时候用的是静态库,则静态库中用到的内容会全部在可执行文件中,可执行文件较长。如果多个可执行文件均由同一个静态库生成,则这些文件一起执行的时候内存中会有同一函数的多份副本。而如果用共享库生成可执行文件,则可执行文件中只有对用到的部分的引用。如果多个可执行文件均由同一个共享库生成,则这些文件一起执行的时候内存中只有一份副本。

例子

接下来我们把上面打印 “Hello World!”的功能单独提出到一个函数里,建立头文件并创建库,来演示我们上面讲的知识。
1) 建立helloWorld.h头文件,声明sayHello方法,文件内容如下:

void sayHello(void);

2) 建立helloWorld.c源文件,实现sayHello方法:

//因为我们在sayHello方法中用到了printf,所以要引入stdio.h
#include <stdio.h>

void sayHello(void)
{
        printf("Hello World!\n");
}

3) 通过helloWorld.c,制作对应的库文件libhello.a。在终端中输入如下命令:

#编译并汇编helloWorld.c,生成目标文件helloWorld.o
gcc -c helloWorld.c

#由目标文件sayHello.c生成库文件libhello.a
ar crv libhello.a helloWorld.o

4) 建立一个源文件prog.c,这个文件里面会用到我们在helloWorld.h中声明的sayHello方法:

//因为我们用到了在helloWorld.h中声明的sayHello方法,所以这里要引入它
#include "helloWorld.h"

int main()
{
        sayHello();
}

好了,我们将prog.c生成可执行文件并执行它:

#下面的命令中的-L.中的 "."表示当前目录
gcc -o prog prog.c -L. -lhello
./prog

执行结果如下:
这里写图片描述

【快速入门】创建你的第一个linux程序(详细教程) 介于有些同学想学习linux,但是又不知道如何着手,希望笔者能这篇博客给大家简单的参考,运行环境为centos+xshell。 一.快速入门 1.打开Linux命令行,输入以下命令,创建出名叫helloworld.c的文件 vim helloworld.c 2.在英文模式下,按i进入插入模式,然后开始正常编辑代码,如下 #include<stdio.h> int main(){ printf("helloworld"); return 0; } 3.代码编辑完毕后,按.. 阅读详情

相关推荐

Linux系统编程(环境变量编程)

本篇文章我们来讲解环境变量编程,环境变量在Linux中可以说是非常重要的,那么这篇文章将会带大家来学习环境变量的编程。本篇文章就讲解到这里,环境变量对于进程来说是非常重要的一个部分。

m0_49476241的博客 683

linux系统编程(全)

给定一个文件的路径名,open()返回一个文件描述符,一个小的非负整数,用于后续的系统调用(read(2), write(2), Iseek(2), fcntl(2),等等)。成功调用返回的文件描述符将是进程当前未打开的编号最低的文件描述符。失败:返回 -1程序是静态的概念,gcc xxx.c -o pro磁盘中生成的文件,叫做程序。进程是程序的一次运行活动,通俗点的意思就是程序跑起来了,系统中就多了一个进程。每一个进程都有一个非负整数表示的唯一ID,叫做pid,类似身份证pid = 0;

qq_47944751的博客 1万+

【go从入门到精通】go环境安装和第一个经典程序

恭喜你,你已经具备了开发go的条件了,接下来我将分享语法,函数,方法,面向对象,网络,并发编程,常用标准库,beego,gin,微服务文件读写,pprof性能调优,加解密,token,流控,数据库聊天室,游戏服务器笔试面试题分析其他。。。t=N7T8t=N7T8vscode下载地址https://code.visualstudio.com/Download。

yolo模型训练找我,AI游戏合作找我 8万+

(五)Linux的编程环境

make 工程管理器也就是个“ 自动编译管理器” ,它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量, 同时, 它通过读入makefile 文件的内容来执行大量的编译工作。递归展开方式定义的变量是在引用该变量时进行替换的, 即如果该变量包含了对其他变量的引用, 则在引用该变量时一次性将内嵌的变量全部展开, 虽然这种类型的变量能够很好地完成用户的指令, 但是它也有严重的缺点, 如不能在变量后追加内容( 因为语句:CFLAGS = $(CFLAGS) -O 在变量扩展过程中可能导致无穷循环)。

小新的博客 940

领域驱动新实践:COLA框架全解析——架构设计与实战案例解析

定义订单支付事件java代码解读复制代码} }Order定义Order类,继承并实现支付逻辑:java代码解读复制代码} }定义接口:java代码解读复制代码定义类,处理订单支付逻辑并持久化:java代码解读复制代码} }定义和处理订单支付事件:java代码解读复制代码} }java代码解读复制代码} }定义和接口及其实现:java代码解读复制代码java代码解读复制代码。

2401_89221445的博客 2659

Keil 丢失编译器版本5、内核文件core_cm3.c报错

若用的是旧版本的core_cm3.c ,就使用编译器v5编译工程;若想用编译器v6,就更新4个相关的内核文件:(CMSIS:Cortex Microcontroller Software Interface Standard,ARM Cortex™ 微控制器软件接口标准)

qq_52804040的博客 6238

Linux环境编程(高级编程)

基于Linux操作系统这个环境,编程。分为以下四个模块:文件编程多任务编程(进程,线程)网络编程网页+数据库例:网易.mp3把歌曲保存成mp3这个文件 //文件编程歌曲从服务器传输到本地 //网络编程听歌的同时,可以聊天,可以玩游戏 //多任务编程目标:实现应用的功能使用Linux 系统提供的一些函数来实现功能学习的方式方法:1.Linux提供的这些函数---该怎么用?

m0_63067779的博客 955

高精度有源积分器设计:基于罗氏线圈的电流测量方案解析

在电力系统保护、工业自动化及高精度计量领域,电流的非接触式精确测量是核心需求。传统电流互感器存在磁芯饱和、频带受限等局限,难以应对现代电力电子设备产生的复杂波形。罗氏线圈作为一种空心电流传感器,凭借其宽频带、高线性度及无饱和风险的优势,成为理想解决方案。其工作原理基于法拉第电磁感应定律,输出信号与被测电流的导数成正比,因此必须通过积分运算恢复原始电流波形。积分器的精度、稳定性及动态响应直接决定了整个测量系统的性能上限。一个设计精良的有源积分器能有效解决直流漂移、相位误差及噪声放大等挑战,在继电器保护、断路器

weixin_30036289的博客 310

C++开发入门——环境搭建与第一个程序

C++开发环境搭建与首个程序解析 本文系统介绍了C++开发环境的搭建方法,涵盖Windows(VS2022)、macOS(Xcode)和Linux(GCC)三大平台。详细讲解了编译器(MSVC/GCC/Clang)和IDE的选择与配置,并逐步指导读者完成首个"Hello World"程序的编写、编译和运行。文章深入解析了C++程序的基本结构,包括预处理器指令、命名空间和main函数等重要概念,帮助初学者理解代码背后的原理。通过环境搭建和首个程序的实践,读者可以掌握C++开发的基础流程,为

编程世界如山海,探索不止。 1万+

SDI-12协议与STM32 进行uart通信

其中DIR_OUT_SDI是一个IO引脚,控制UART_TX_SDI是否使能,U10是三态门IC,即拉低DIR_OUT_SDI使能stm32输出,拉高DIR_OUT_SDI失能输出,串口配置8位数据位,偶校验,1位停止位,1200波特率。示波器测试得到传感器的应答信号如下:第一个是唤醒信号,拉高电平13毫秒,之后保持20毫秒低电平,第二个数据帧是激活信号,即ascii码: "0!",第三个是传感器的应答信号:"0\r\n"

weixin_42186805的博客 4401

华为 S2600T 存储 3 种网络端口(H4/H5/串口)用途解析与故障恢复实战

本文深度解析华为S2600T存储设备的三种关键网络端口(H4/H5/串口)的功能用途与故障恢复方法。通过详细的配置指南和实战案例,帮助管理员掌握管理接口(H4)的日常运维、维护接口(H5)的高级应用以及串口的应急操作,提升存储设备的可靠性和维护效率。

weixin_30899023的博客 332

Linux系统编程入门:从零开始编写你的第一个Hello World程序

本文介绍了在Linux系统下编写和运行第一个C语言"Hello World"程序的完整过程。主要内容包括:Linux与Windows编程环境对比;使用vi或gedit创建源文件;编写基础C程序代码;通过GCC编译器将源代码转换为可执行文件(包括一步编译和分步编译两种方式);以及最终运行程序的步骤。文章特别强调了Linux环境下命令行操作的特点,并解释了分步编译在多文件项目中的优势。适合Linux编程初学者快速上手,为后续学习系统编程打下基础。

一枚嵌入式小白菜的摸爬滚打之路 927

Maya绑定:人物绑定详细案例(创建骨骼、镜像骨骼、IK创建、IK打组、IK控制器、FK控制器、烘焙动画、导出)

Maya绑定:人物绑定详细案例(创建骨骼、镜像骨骼、IK创建、IK打组、IK控制器、FK控制器、烘焙动画、导出)

m0_45877477的博客 1627

我在Linux开发板上跑的第一个Qt程序

摘要:学Linux不难,难的是没有找对教程,没有人快速的带你。开发板买了之后就放在那里吃灰,看视频也看不下去,看文档又看不懂,太难了!本文以通俗易懂的方式讲一下在正点原子Linux开发板上跑一个qt程序的基本步骤,争取让初学者能够在半天的时间跑通第一个程序。...

果果小师弟的博客 1万+

RT-Thread必考面试题及参考答案

RT-Thread的设备驱动模型遵循层次化的结构,设计简洁且易于扩展。它主要由设备注册、设备操作和设备控制三部分组成。设备驱动模型允许开发者为不同的硬件设备编写驱动程序,这些驱动程序可以被RT-Thread内核统一管理和调度。在RT-Thread中,设备被抽象成一系列标准的接口,包括打开、关闭、读取、写入、控制等操作,这些操作封装在结构体中。设备驱动程序需要实现这些接口,然后通过调用函数注册设备,使其对系统可见。这种模型不仅简化了驱动开发,还提高了代码的可移植性和可维护性。

大模型大数据攻城狮的专栏 1821

Unity 面试篇|(二)Unity基础篇 【全面总结 | 持续更新】

在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,Unity的协程实在每帧结束之后去检测yield的条件是否满足。一个程序在运行(执行)的过程中所需要的硬件和软件环境运行时的主要作用是提供程序运行所需要的环境和基础设施,通过为程序提供内存分配、线程管理、类型检查、对象实例化和垃圾回收等操作来支持程序的运行公共语言运行时(Common Language Runtime,CLR)是整个.NET框架的核心,它为.NET应用程序提供了一个托管的代码执行环境。

游戏开发小Y的博客 13万+

Linux下C++的编程——开发环境搭建与第一个程序

上一篇文章Linux下C++的编程——开偏介绍中我们已经介绍了GUN、GCC、G++等一些重要的概念,现在应该开始动手实践了!开发工具的安装环境 Distributions版本:CentOS 6.7 Linux内核片:2.6.32-573.3.1.el6.i686一般Linux安装完之后默认就已经安装了GCC(GNU Compiler Collection),你可以查看一下gcc和g++的版本号

阳光日志 7万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

在Linux下运行你的第一个汇编程序

在Linux下运行你的第一个汇编程序 汇编语言对于大多数程序员来说都是进而远之的,原因当然是汇编语言晦涩难懂,各种指令搞得人头疼,不过汇编语言适当了解一些还是蛮有意思的,今天带大家在Linux上运行第一个汇编程序! 在 Linux 操作系统中,你有很多办法可以实现在屏幕上显示一个字符串,但最简洁的方式是使用 Linux 内核提供的系统调用。使用这种方法最大的好处是可以直接和操作系统的内核进行通讯,...

冷色调的夏天的博客 2万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

在Linux上初探仓颉编程语言:从安装到第一个程序

本文记录了在Linux环境下安装和使用仓颉编程语言的完整实践过程。作者基于Ubuntu 18.04系统,详细介绍了仓颉工具链的安装步骤、环境配置及依赖处理,并编写了首个"Hello World"程序进行验证。文章重点突出了仓颉语言的特性优势,包括多后端支持、多范式编程、安全性设计以及丰富的内置库等。体验表明仓颉在Linux平台具有良好的兼容性和易用性,其现代化设计理念和高效工具链给开发者带来便捷的开发体验。作者还分享了工具链的卸载更新方法,并表达了对仓颉语言后续深入探索的期待。

2401_84891913的博客 1375

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Linux下go环境安装、环境配置并执行第一个go程序

一、安装 1.Golang对Linux的内核版本要求 GO对Linux内核版本最低要求是 2.6.23,对应要求操作系统版本是: RHEL 6.0+ CentOS 6.0+ 即,不支持 (RHEL 和 CentOS) 的 (4.x or 5.x)。 2.下载golang的代码版本 Golang的官网下载地址:https://golang.org/dl/ 3.安装 ...

Attacking_Ape的博客 1万+

C++网络编程入门学习(一)-- Linux环境下的C++程序编译与运行

本博客将帮助读者入门学习基于C++的网络编程,并重点介绍了在Linux环境下的C++程序编译与运行。在博客中,我们将首先介绍了几个在VSCode中常用的插件,并详细讲解了静态库与动态库的概念及使用方法。接下来,我们还将介绍了makefile的使用,包括使用makefile进行编译与运行以及不使用makefile的编译运行方法。此外,我们还提供了使用cmake进行编译与运行的方法,并引入了gdb代码调试入门的内容。通过阅读本博客,读者将能够掌握在Linux环境下的C++程序编译与运行的基本技巧。

小L的博客 2391

Linux入门篇学习——Linux 第一个程序 HelloWorld和Linux 环境变量

本文介绍了Linux环境下GCC编译器的基本使用和编译流程,以及环境变量的配置方法。主要内容包括:1.使用GCC编译HelloWorld程序的基本步骤,包括预处理(-E)、编译(-S)、汇编(-c)和链接四个阶段;2.环境变量的概念和作用,重点讲解了PATH变量的修改方法,包括临时修改(export命令)和永久修改(.bashrc文件)两种方式;3.环境变量修改的用户范围限制,说明修改仅对当前用户有效。文章通过具体命令示例演示了从源代码到可执行文件的完整编译过程和环境变量的配置操作。

2301_80366509的博客 1049

编程环境搭建:从安装到第一个 Hello World

搭建编程环境并不难,关键是要勇于动手尝试。一旦成功运行第一个,你就完成了编程的“点火仪式”。

X2829352498的博客 1032

Python编程入门:从零基础到写出第一个程序,从零基础到精通,收藏这篇就够了!

Python是一门简单易学、功能强大的编程语言,广泛应用于数据分析、人工智能、Web开发等领域。无论你是编程小白,还是希望学习一门新语言的开发者,Python都是绝佳的选择。本文将带你从零开始,掌握Python的基础知识,并写出你的第一个Python程序!可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。通过本文,你已经掌握了Python的基础语法,并写出了第一个Python程序。这也是耗费了大白近四个月的时间,吐血整理,文章非常非常长,觉得有用的话,希望粉丝朋友帮忙点个**「分享」

Libra1313的博客 2687

Python 从入门到实战(一):环境搭建与第一个程序(零基础保姆级教程)

![c6e3154d215982a75f2280a6ca6650b4.jpeg](https://i-blog.csdnimg.cn/img_convert/d3ed330c3d86870b0c169f664f1e2581.jpeg) @[toc] 欢迎来到「Python 从入门到实战」系列专栏。不管你是完全没接触过编程的新手,还是想转行学 Python 的职场人,这个系列都会带你从最基础的操作开始,一步步掌握 Python 核心技能 —— 从变量、循环这些基础语法,到数据可视化、Web 开发、游戏制作这

stubborn_stone_的博客 989
上一篇: 【Linux环境编程入门】二、Linux常用命令以及vim的介绍
下一篇: 【Linux环境编程入门】四、文件操作的系统调用
import_java_any
博客等级 码龄10年 15粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值