Linux之C编程入门

news2024/12/24 11:27:11

目录

第1关:第一个C程序

任务描述

相关知识

编译C程序

编程要求

答案及其步骤:

 第2关:Linux编译C程序

任务描述

相关知识

gcc编译器使用方法

编程要求

答案及其步骤: 

第3关:Linux之静态库编写 

任务描述

相关知识

生成静态库

使用静态库

编程要求

答案及其步骤:

第4关:Linux之动态库编写

任务描述

相关知识

生成动态库

使用动态库

更新/etc/ld.so.cache来运行动态库

修改LD_LIBRARY_PATH环境变量

编程要求

答案及其步骤: 


第1关:第一个C程序

任务描述

本关任务:在Linux系统上编写第一个C语言程序Hello world

相关知识

C语言是Linux操作系统中最常用的编程语言,部分原因在于Linux操作系统本身几乎是采用C语言编写的。使用C语言,程序员可以通过函数库和系统调用非常容易地访问系统服务。另外,还有很多有用的工具为程序开发和维护提供了便利。

本实训将讲解如何编译和链接C语言程序,假设用户掌握了C语言的基本语法。在Windows系统上我们编写C语言程序,我们只需在IDE(windows常使用的IDEvisual studio系列)中写入代码,然后点击编译,如果程序没有语法错误则会生成可执行文件,然后点击运行即可运行生成的可执行文件。其实IDE帮助我们自动的编译和运行程序,所以我们不需要关注程序是如何被编译的,而在Linux系统上我们通常要学会如何使用命令来编译程序,此时,我们需要手动的去编译程序,然后手动的运行程序。

编译C程序

Linux系统上常用的C编译器是gcc,大多数开发板都包含了这个工具。

gcc是开源领域应用最广泛的编译器之一,其具有功能强大,编译代码支持性能优化等特点。而Windows系统上常用的编译器叫cl.exe,该编译器就是Visual Studio集成开发环境所使用的默认编译器。当我们点击编译按钮,Visual Studio则会自动帮我们调用cl.exe编译器去编译我们所写的程序。

使用gcc编译C程序非常简单,可以使用如下命令来编译程序:

gcc 源文件

案例演示1:

使用vim编辑器编写一个“Hello world”C程序,并将源文件保存为test.c,然后编译运行test.c,可以使用如下命令:

vim test.c
gcc test.c
./a.out

使用vim编写如下代码

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

[请在右侧“命令行”里直接体验]

注意
 

`gcc`默认使用`a.out`作为可执行文件的名字;
./a.out表示运行当前目录下的a.out命令;
编程要求

本关任务是学会使用gcc编译C程序。

具体编程要求如下:

在当前目录下编写一个简单的C程序,输入“Hello world”字符串;

使用gcc编译生成a.out可执行文件;

答案及其步骤:

首先输入如下:

vim test.c    //使用vim编辑器编写,并将源文件保存为test.c

进入编写如下c语言代码:

#include <stdio.h>
int main()
{
    printf("Hello world\n");
}

按i键开始编写

编写完后按Esc键退出编写模式,按Shift键+:键,输入wq保存并退出

gcc test.c    //编译test.c
./a.out    //运行test.c

 第2关:Linux编译C程序

 

任务描述

本关任务:学会gcc编译器的基本使用方法。

相关知识

通过上一关内容学会了如何使用gcc命令来编译C程序,本关将进一步学习gcc编译器。

C语言程序从源代码到二进制行程序需要经历如下四个步骤:
 

预处理
编译
汇编
链接

[C语言编译流程]

预处理 预处理是根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。

编译 编译是指将预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后,产生相应的汇编代码文件。

汇编 汇编是指将编译完的汇编代码文件翻译成机器指令,并生成可重定位目标程序的.o文件,该文件为二进制文件,字节编码是机器指令。

链接 链接过程是指链接器将一个个目标文件(或许还会有库文件)链接在一起生成一个完整的可执行程序,这个可执行程序才是我们最后直接执行的文件。

gcc编译器使用方法

gcc命令具体使用方法如下:

gcc  命令选项 参数

常用命令选项如下:

-o:指定生成的输出文件名字;
-E:仅执行编译预处理;
-S:将C代码转换为汇编代码;
-c:仅执行编译和汇编操作,不进行连接操作;
-I:包含库的头文件路径(大写i);
-L:指定库所在的路径;
-l:指定使用的库(小写l);

案例演示1:

使用vim编辑器编写一个“Hello world"C程序,并将源文件保存为test.c,编译test.c,指定输出可执行文件为test,并运行test,可以使用如下命令:

gcc test.c -o test
./test

使用vim编写如下代码

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

[请在右侧“命令行”里直接体验]

案例演示2:

仅编译test.c生成汇编语言,可以使用如下命令:

gcc -S test.c

[请在右侧“命令行”里直接体验]

注意编译生成的汇编文件使用.s为后缀名,汇编生成的二进制文件使用.o为后缀名。

 

编程要求

本关任务是学会使用gcc编译C程序。

具体编程要求如下:

在当前目录下编写一个简单的C程序,输入“Hello GCC”字符串;

使用gcc编译生成名为firstExec的可执行文件;

答案及其步骤: 

首先输入如下:

vim test.c    //使用vim编辑器编写,并将源文件保存为test.c

进入编写如下c语言代码:

#include <stdio.h>
int main()
{
    printf("Hello GCC\n");
}

按i键开始编写


编写完后按Esc键退出编写模式,按Shift键+:键,输入wq保存并退出

 

gcc test.c -o firstExec    //编译test.c文件,并指定生成的输出出文件的名字
./firstExec    //运行firstExec文件

第3关:Linux之静态库编写 
任务描述

本关任务:学会在Linux系统上生成C语言的静态库。

相关知识

在实际的软件开发时, 应该遵守一个基本原则:不要重复造轮子。如果某些代码经常要用到,不仅这个项目能使用,而且也能复用到其它项目上,那么就应该把这部分代码从项目中分离出来,将其编译为库文件,供需要的程序调用。

程序库分为两类,分别是静态库动态库。本关将主要讲解如何生成静态库

Windows系统上的静态库是以.lib为后缀,而Linux系统上的静态库是以.a为后缀的特殊的存档。

Linux系统的标准系统库可在目录/usr/lib/lib中找到。比如,在类Unix系统中C语言的数序库一般存储为文件/usr/lib/libm.a。该库中函数的原型声明在头文件/usr/include/math.h中。

生成静态库

Linux下,我们可以使用gccar工具制作和使用自己的静态库,具体过程如下:

将源码文件编译成.o目标文件;
使用ar工具将多个目标文件打包成.a的静态库文件;

注意Linux系统上默认的静态库名格式为:libxxx.a,其中xxx为生成库的名称。

案例演示1:

编写一个函数printHello,其功能为打印“Hello world"字符串,将其编译生成名为Hello的静态库,可以使用如下命令:

vim printHello.h
vim printHello.c
gcc -c printHello.c -o printHello.o
ar rcs libHello.a printHello.o

使用vim编写printHello.h(声明printHello函数,方便以后被其它程序调用)

#ifndef __PRINTHELLO_H__
#define __PRINTHELLO_H__
#include <stdio.h>
void printHello();
#endif

使用vim编写printHello.c

#include <stdio.h>

void printHello()
{
    printf("Hello world\n");
}

[请在右侧“命令行”里直接体验]

使用静态库

静态库的使用方法只需要在编译程序的时候指明要链接的库名称即可,gcc中有两个参数是关于链接库时所使用的,分别是:-L-l

-L:用于告诉gcc要链接的库所在目录;
-l:用于指明链接的库名称(小写l);

案例演示1:

调用以上案例生成的printHello函数,可以使用如下命令:

vim main.c
gcc main.c -o exe -L ./ -lHello
./exe

使用vim编写main.c
 

#include "printHello.h"
int main()
{
    printHello();
    return 0;
}

[请在右侧“命令行”里直接体验]

 

编程要求

本关任务是学会生成和使用静态库。

具体编程要求如下:

在当前目录下编写一个简单的函数int Add(int a, int b),其功能为计算输入参数a+b的结果;

将Add函数编译生成一个静态库libAdd.a,并存放在当前目录下;

答案及其步骤:
vim Add.h    

 进入如下输入:

#include<stdio.h>
int Add(int a,int b);

vim Add.c

 进入如下输入:

#include<stdio.h>
int Add(int a,int b)
{
    return a+b;
}

gcc -c Add.c -o Add.o
ar rcs libAdd.a Add.o
vim main.c

 进入如下输入:

#include "Add.h"
int main()
{
    int c=Add(1,1);
    return c;
}

gcc main.c -o exe -L ./ -lAdd
./exe

全部输入如下:

第4关:Linux之动态库编写

 

任务描述

本关任务:学会在Linux系统上生成C语言的动态库。

相关知识

上一关学习了如何生成静态库,本关将继续讲解如何生成动态库

静态库动态库的区别:

静态库动态库
名称命名方式是"libxxx.a",库名前加"lib",后缀用".a","xxx"为静态库名命名方式是"libxxx.so", 库名前加"lib",后缀用".so", "xxx"为动态库名
链接时间静态库的代码是在编译过程中被载入程序中动态库在编译的时候并没有被编译进目标代码,而是当你的程序执行到相关函数时才调用该函数库里的相应函数
优点在编译后的执行程序不在需要外部的函数库支持,因为所使用的函数都已经被编进去了。动态库的改变并不影响你的程序,所以动态函数库升级比较方便
缺点如果所使用的静态库发生更新改变,你的程序必须重新编译因为函数库并没有整合进程序,所以程序的运行环境必须提供相应的库

Windows系统上的动态库是以.dll为后缀,而Linux系统上的动态库是以.so为后缀的特殊的存档。

生成动态库

Linux下,我们可以使用gcc制作和使用动态库,具体制作过程如下:

使用gcc命令加-fPIC参数将源码文件编译成.o目标文件;
使用gcc命令加-shared参数将多个目录文件生成一个动态库文件;

注意Linux系统上默认的动态库名格式为:libxxx.so,其中xxx为生成库的名称。

案例演示1:

编写一个函数printHello,其功能为打印"Hello world"字符串,将其编译生成名为Hello的动态库,可以使用如下命令:

vim printHello.h
vim printHello.c
gcc -fPIC -c printHello.c -o printHello.o
gcc -shared  printHello.o -o libHello.so
 

使用vim编写printHello.h(申明printHello函数,方便以后被其它程序调用)
 

#ifndef __PRINTHELLO_H__
#define __PRINTHELLO_H__
#include <stdio.h>
void printHello();
#endif

使用vim编写printHello.c
 

#include <stdio.h>
void printHello()
{
    printf("Hello world\n");
}

[请在右侧“命令行”里直接体验]

使用动态库

动态库的使用方法与静态库使用方式略有不同,除了使用gcc中的-L-l参数外,想要调用动态库还需要更新Linux系统中/etc/ld.so.cache或者修改LD_LIBRARY_PATH环境变量,否则在运行程序的时候会报**"No such file or directory"**错误。

案例演示1:

调用以上案例生成的printHello函数,可以使用如下命令:

vim main.c
gcc main.c -o exe -L ./ -lHello
./exe

[使用vim编写程序]

[请在右侧“命令行”里直接体验]

此时编译正常,当运行的时候会报**"No such file or directory"**错误。

更新/etc/ld.so.cache来运行动态库
编辑/etc/ld.so.conf配置文件,然后加入需要加载的动态库目录。
运行ldconfig更新/etc/ld.so.cache

案例演示1:

更新/etc/ld.so.cache,然后运行上一个案例生成的exe,可以使用如下命令:

sudo vim /etc/ld.so.conf
sudo ldconfig
./exe

[使用vim/etc/ld.so.conf文件添加/home/fzm路径]

[请在右侧“命令行”里直接体验]

修改LD_LIBRARY_PATH环境变量

在运行可执行文件前修改LD_LIBRARY_PATH变量为可执行程序指定需要加载的动态库路径。

案例演示1:

修改LD_LIBRARY_PATH,然后运行上一个案例生成的exe,可以使用如下命令:

LD_LIBRARY_PATH=.  ./exe

[请在右侧“命令行”里直接体验]

注意

LD_LIBRARY_PATH告诉了exe程序现在当前目录下寻找链接的动态库;
当运行环境中同时存在同名的静态库和动态库时,默认优先链接动态库;

编程要求

本关任务是学会生成和使用动态库。

具体编程要求如下:

在当前目录下编写一个简单的函数int Sub(int a, int b),其功能为计算输入参数a-b的结果;

将Sub函数编译生成一个动态库libSub.so,并存放在当前目录下;

修改/etc/ld.so.conf,添加当前目录,并更新/etc/ld.so.cache

答案及其步骤: 
 
vim Sub.h

进入如下输入:
 

#include<stdio.h>
int Sub(int a,int b);

vim Sub.c

进入如下输入:

#include<stdio.h>
int Sub(int a,int b)
{
    return a-b;
}

gcc -fPIC -c Sub.c -o Sub.o
gcc -shared Sub.o -o libSub.so
vim main.c

进入如下输入:

#include "Sub.h"
int main()
{
    int c=Sub(1,1);
    return c;
}

gcc main.c -o exe -L ./ -lSub
vim /etc/ld.so.conf

进入如下输入:

/root    //输入/root


 

ldconfig
./exe

全部输入如下:

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

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

相关文章

【听劝】别盲目备考NPDP,思维导图助你高效学习

还在为如何高效学习NPDP而苦恼吗&#xff1f; 今天给大家分享NPDP认证考试必备的学习资料&#xff1a;思维导图。 &#xff08;内容来自圣略NPDP资深讲师整理&#xff09; 详细梳理了课本内容&#xff0c;保存到手机学习&#xff0c;非常方便&#xff01; 思维导图会陆续更…

web自动化系列-selenium的3种弹框操作(十二)

在进行功能测试时 &#xff0c;经常会遇到出现各种的弹出的提示 &#xff0c;比如删除数据给出提示 、做某个操作时也会弹框给出一些友好提示 &#xff0c;因为这些弹框都是做web操作时的一些常用组件 &#xff0c;所以&#xff0c;selenium就不得不支持这些组件 。 1.弹框介绍…

Python基础04-操作系统中的文件与目录操作

在与操作系统交互时&#xff0c;我们经常需要执行文件和目录的操作。Python提供了丰富的库来帮助我们完成这些任务。以下是一些常见的操作&#xff0c;以及如何使用Python代码来实现它们。 1. 导航文件路径 在不同的操作系统中&#xff0c;文件路径的格式可能不同。Python的o…

WAF攻防-漏洞发现协议代理池GobyAwvsXray

知识点 1、Http/s&Sock5协议 2、Awvs&Xray&Goby代理 3、Proxifier进程代理使用 4、Safedog&BT&Aliyun防护在漏洞发现中&#xff0c;WAF会对三个方向进行过滤拦截&#xff1a; 1、速度频率问题&#xff08;代理池解决&#xff09; 2、工具的指纹被识别&am…

【Leetcode笔记】236.二叉树的最近公共祖先

文章目录 题目要求ACM运行结果 题目要求 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能…

Zabbix监控Oracle归档日志空间

1、oracle查看归档日志空间的sql语句 select sum(PERCENT_SPACE_USED) from v$recovery_area_usage; 2、交互式查看oracle归档日志空间的命令&#xff0c;可以手动执行一下&#xff0c;注意要用oracle用户 sqlplus -S "/ as sysdba" << EOF select sum(PER…

python使用uiautomator2操作真机(vivo Y30)

环境&#xff1a; python3.8.10&#xff0c;vivo Y30(8G,128g)&#xff0c;版本android 10。 之前写过&#xff1a; python使用uiautomator2操作真机&#xff08;荣耀10青春版&#xff09;_python真机操作-CSDN博客 python使用uiautomator2操作真机&#xff08;oppo a9x&a…

CompletableFuture编排异步线程

CompletableFuture 是 Java 8 引入的一种新的 Future&#xff0c;设计目的是为了编写非阻塞的异步代码。 传统异步编程方式 传统异步编程方式获得异步任务值&#xff0c;首先我们得通过future task &#xff0c;然后创建一个实现callable内部类&#xff0c;或者通过lambda的表…

JAVA学习笔记31(IO流)

1.IO流 1.文件流 ​ *文件在程序中是以流的形式来操作的 2.常用文件操作 1.创建文件对象 1.new File(String pathname) //根据路径构建一个File对象 main() {}public void create01() {String filePath "e:\\news1.txt";File filePath new File(filePath);tr…

人人都会给视频换脸_出色的AI换脸软件离线版你可以把视频换上明星脸

网盘下载 简单几步骤: 1、找个人脸照片&#xff0c;正面高清 2、找个视频&#xff0c;最好是单人的视频&#xff0c;或者只有一个女的&#xff0c;这样可以按照条件换脸 3、点击开始&#xff0c;等待完成即可&#xff08;显卡勾选显卡&#xff0c;显卡不行选择CPU&#xff09;…

最新win11配置cuda以及cudnn补丁教程

1、首先使用指令 nvidia-smi 查看电脑支持的**最高cuda**版本&#xff0c;例如&#xff1a;本机 12.2 2、进入CUDA下载cuda安装包 https://developer.nvidia.com/cuda-toolkit-archive 2、点击上方绿色的链接&#xff0c;按照图中序号选择的即可&#xff0c;最后点击下载。 …

【MySQL 数据宝典】【磁盘结构】- 004 redolog 重做日志

一、背景介绍 持久性要求&#xff1a; 对于已提交的事务&#xff0c;即使系统发生崩溃&#xff0c;其对数据库的更改也不能丢失。问题&#xff1a; 在事务提交前将所有修改的页面刷新到磁盘浪费资源。随机IO导致刷新速度慢。 解决方案&#xff1a; 【数据副本】记录事务执行过…

中仕公考:广东省2024高校毕业生‘三支一扶‘开始报名

广东省2024高校毕业生三支一扶于今日4月22日正式开始报名&#xff0c;报名人员请于2024年4月22日9:00-4月26日17:00登录广东省高校毕业生“三支一扶”计划信息管理系统进行报名。

裤子什么面料适合夏季?必备的五条夏季男生裤子

许多男生朋友应该都发现&#xff0c;想选一条穿着舒服的裤子可真不容易&#xff0c;总是会出现各种情况&#xff0c;列如常见的卡档、显腿粗、显矮等等。甚至还会出现一些质量问题&#xff0c;导致各种闹心。 为了让大家可以找到更适合自己的裤子&#xff0c;我特别花了比较长…

HTML重要标签梳理学习

1、HTML文件的框架 使用VS Code编码时&#xff0c;输入!选中第一个&#xff01;就可以快速生成一个HTML文件框架。 2、标签 <hr> <!--下划线--> <br> <!--换行--> <strong>加粗</strong> &…

ChatGPT4.5:能力大提升,全新体验

说明 ChatGPT4是2023年的5月份发布的&#xff0c;马上就发布一周年了。其他的大语言模型&#xff0c;比如Claude和开源的Lama也相继更新了最新版本。而根据目前国外发布的各种消息来看&#xff0c;ChatGPT4.5也即将发布。 GPT-4.5 Turbo 发布时间 最新消息显示&#xff0c;Op…

Meta 发布 Llama 3:迄今为止最强大的开源大语言模型

Meta 发布了 Llama 3&#xff0c;其中包含 8B 和 70B 两个版本。Llama 3 以强大的性能和丰富的功能成为迄今为止最强大的开源大语言模型之一。从已经释放的信息来看&#xff0c;Llama 3 在模型架构、训练数据、训练规模和指令微调等方面进行了多项改进&#xff0c;使其在推理、…

详解Java中的五种IO模型

文章目录 前言1、内核空间和用户空间2、用户态和内核态3、上下文切换4、虚拟内存5、DMA技术6、传统 IO 的执行流程 一、阻塞IO模型二、非阻塞IO模型三、IO多路复用模型1、IO多路复用之select2、IO多路复用之epoll3、总结select、poll、epoll的区别 四、IO模型之信号驱动模型五、…

Git 原理及使用 (带动图演示)

文章目录 &#x1f308; Ⅰ Git 安装&#x1f319; 01. Linux - centos &#x1f308; Ⅱ Git 工作区、暂存区和版本库&#x1f319; 01. 认识工作区、暂存区和版本库&#x1f319; 02. 使用 Git 管理工作区的文件 &#x1f308; Ⅲ Git 基本操作&#x1f319; 01. 创建本地仓库…

Java代码基础算法练习-斐波纳契数列-2024.04.22

任务描述&#xff1a; 1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8&#xff0c;13&#xff0c;21&#xff0c;34&#xff0c;55&#xff0c;89……这个数列则称为“斐波那契数列”&#xff0c;其中每 个数字都是“斐波那契数”。 输入一个整数N(N不大…