Linux之C编程入门

目录

第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.mzph.cn/pingmian/1561.shtml

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

相关文章

【深度学习】Attention、Self-Attention、Multi-Head Attention

一、Attention 在CV领域&#xff0c;注意力机制通常分为通道注意力和空间注意力或者两者结合。 一张图像经backbone得到的特征通常包括多个通道&#xff0c;每个通道是一个像素矩阵&#xff0c;每个通道对任务的贡献不尽相同&#xff0c;单个通道的特征图中每个像素对任务的贡…

2W 3KVDC 隔离双输出 DC/DC 电源模块——TPD-2W 系列

TPD-2W系列提供双独立输出电压&#xff0c;并且两组电压可以不同&#xff0c;这样就节省一个电源模块&#xff0c;特别适合一块板上有多个不同电压要求的设计&#xff0c;而外形尺寸和TPA一样&#xff0c;工作温度范围广-40℃到 105℃。

LabVIEW连接postgre sql

一、安装ODBC 下载对应postgreSQL版本的ODBC 下载网址&#xff1a;http://ftp.postgresql.org/pub/odbc/versions/msi/ 下载好后默认安装就行&#xff0c;这样在ODBC数据源中才能找到。 二、配置系统DSN 实现要新建好要用的数据库&#xff0c;这里的用户名&#xff1a;postg…

new[]与delete[]

&#xff08;要理解之前关于new,delete的一些概念&#xff0c;看​​​​​​ CSDN&#xff09; 引子&#xff1a; 相比new&#xff0c;new[]不仅仅是个数的增加&#xff0c;还有int大小记录空间的创建&#xff0c; 下图中错误的用模拟多个new来替代new[]&#xff0c;释放步…

9.MMD 基础内容总结及制作成品流程

前期准备 1. 导入场景和模型 在左上角菜单栏&#xff0c;显示里将编辑模型时保持相机和光照勾选上&#xff0c;有助于后期调色 将抗锯齿和各向异性过滤勾掉&#xff0c;可以节省资源&#xff0c;避免bug 在分辨率设定窗口&#xff0c;可以调整分辨率 3840x2160 4k分辨率 1…

【python】图形用户界面学习之tkinter

认识tkinter Tkinter是Python中内置的图形用户界面&#xff08;GUI&#xff09;库。它是Tk GUI工具包的接口&#xff0c;可以创建和管理窗口、按钮、标签、文本框等各种GUI组件&#xff0c;并与用户交互。 使用Tkinter&#xff0c;可以创建各种GUI应用程序&#xff0c;如桌面…

QT Webengine开发过程报错qml: Render process exited with code 159 (killed)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、解决方法二、补充说明总结 前言 基于QT的Webengine开发过程中&#xff0c;QT的官方示例quicknanobrowser也无法成功运行&#xff0c;程序运行后&#xff0…

git的学习

设置用户&#xff08;目的在于可以在远端看到是谁提交了内容&#xff0c;更方便公司的管理&#xff09; 1、设置全局用户&#xff08;在家路径下创建用户&#xff0c;每个项目都用这一个用户&#xff09;>: git config --global user.name manba >: git config --global …

使用Go语言和chromedp库下载Instagram图片:简易指南

摘要/导言 本文将介绍如何使用Go语言配合chromedp库来下载Instagram上的图片。我们将通过一个简单的示例来展示整个过程&#xff0c;包括如何设置爬虫代理IP以绕过网络限制。 背景/引言 在数据采集和自动化测试领域&#xff0c;Go语言以其出色的执行效率、简洁的语法和卓越的…

【科学研究】那些考进精英大学的农家子弟们

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

智能化转型的得力助手:山海鲸智慧工厂解决方案详解

在数字化浪潮席卷全球的今天&#xff0c;工业领域正迎来一场前所未有的智能化变革。作为这一变革的领军者&#xff0c;山海鲸智慧工厂解决方案以其前瞻性的技术理念和创新的解决方案&#xff0c;为工业发展注入了强大的动力。 山海鲸智慧工厂解决方案的核心在于其高度的集成性…

Windows Server 2012 R2 中 IIS 8.5 安装证书

文章目录 前言一、获取服务器证书二、证书格式转换二、IIS8安装证书1.Win R 键打开运行窗口 → 输入【inetmgr】→ 点击【确定】2.打开【IIS管理器】→ 点击计算机名称 → 双击打开【服务器证书】3.点击【导入】4.选择证书文件 → 输入密码 → 点击【确定】5.选择要使用证书的…

14. Spring AOP(二)实现原理

源码位置&#xff1a;spring_aop 上一篇文章中我们主要学习了AOP的思想和Spring AOP使用&#xff0c;本文讲的是Spring是如何实现AOP的&#xff0c;Spring AOP是基于动态代理来实现AOP的&#xff0c;在将动态代理之前先来了解一下什么是代理模式。 1. 代理模式 在现实中就有许…

深度学习transformer架构详细详解

一、transformer的贡献 transformer架构的贡献&#xff1a;该架构只使用自注意力机制&#xff0c;没有使用RNN或卷积网络。且可以实现并行计算&#xff0c;加快模型训练速度。 &#xff08;将所有的循环层全部换成&#xff1a;multi-headed self-attention&#xff09; 二、t…

VisualStudio2019和2022开发Winform项目用到Devexpress组件报错不能正确加载的解决办法

1.报错1 问题简单描述&#xff1a;DevExpress.Utils.ImageCollectionStreamer 无法强制转换为 DevExpress.Utils.ImageCollectionStreamer。 原因分析&#xff1a;原项目某个组件使用的是 DevExpresss.XtraBars.v15.1版本&#xff0c;直接引用扩展控件改成引用v20.2。 解决办法…

负载均衡集群——Nginx

目录 1.Nginx反向代理实战 2.Nginx 反向代理和负载均衡实践 实验操作步骤 步骤 1 Nginx1 和 Nginx2 配置 步骤2 测试资源是否可用 步骤 3 安装和配置 Nginx 代理 步骤 4 代理服务器配置检测 步骤 5 在 Nginx1 和 Nginx2 配置虚拟主机 步骤 6 将虚拟主机添加入后端主机组…

BMR:基于Boostrapping多视图的虚假新闻检测

一、概述 文章提出了三种视图信息来表示一篇新闻&#xff1a;文本、图像结构、图像语义。然后设计了改进的多门混合专家系统&#xff08;iMMoE&#xff09;来进行信息融合。保留单模态信息来保证特征对新闻的保真性&#xff0c;增加的多模态信息能保证不同模态的一致性&#xf…

【KingSCADA】通过地址引用和弹窗模板实现设备控制

当相同的设备过多时&#xff0c;要做很多相同的弹窗&#xff0c;这种情况下可以通过地址引用和弹窗模板实现设备控制。 1.变量创建 2.画面开发 以阀门控制为例&#xff0c;只需要做一个阀门控制界面模板 3.地址引用 # 4.实现效果

每日算法4/21

LCR 073. 爱吃香蕉的狒狒 题目 狒狒喜欢吃香蕉。这里有 N 堆香蕉&#xff0c;第 i 堆中有 piles[i] 根香蕉。警卫已经离开了&#xff0c;将在 H 小时后回来。 狒狒可以决定她吃香蕉的速度 K &#xff08;单位&#xff1a;根/小时&#xff09;。每个小时&#xff0c;她将会选…

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

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