写点什么

Linux 开发 _Makefile 规则与 Shell 脚本语言

作者:DS小龙哥
  • 2022 年 6 月 16 日
  • 本文字数:2230 字

    阅读完需:约 7 分钟

介绍交叉编译器静态库、动态库的编译方式;介绍 Makefile 规则、语法;介绍 Shell 脚本常见语法、Shell 脚本常见练习题等等。

任务 1:静态库与动态库

交叉编译--动态编译与静态编译方式:


[root@wbyq test]# arm-linux-gcc 123.c -o app_1 
[root@wbyq test]# arm-linux-gcc -static 123.c -o app_2
复制代码


Linux 下库文件存放的位置: /lib (存放的是动态库)


.so 属于动态库 : .a属于静态库


动态库称为共享库:gcc 123.c -o app


共享库:程序在运行的时候去调用函数(载入函数)。


静态库:相关的函数在编译的时候就已经拷贝到目标中。

任务 2:Makefile

Makefile :用于编写程序的编译规则。 make 命令用于执行 Makefile 文件。


make 常用的选项参数:


-n :  输出命令的执行过程,不执行名称
-s : 隐藏命令本身。 在命令前面加上@符号,可以隐藏命令本身。
$(shell pwd)
CC : 特殊变量,用于存放编译器。
复制代码


练习:


【1】Makefile 自动化编译


只是创建 3 个目录,每个目录下各有一个.c 一个.h


在顶层目录下创建一个 Makefile 文件,实现自动化编译。


CC=gccVPATH=./abcapp:print.o main.o sum.o  $(CC) $^ -o $@%.o:%.c  $(CC) $< -o $@ -cclean:  rm ./*.o app -rf
复制代码


【2】Makefile 自动化编译


需要创建 3 个目录,每个目录下各有一个.c 一个.h,一个 Makefile 文件


在顶层目录下创建一个 Makefile 文件,实现自动化编译。


特殊符号:


冒号用法: <目标文件>:<依赖文件 1> <依赖文件 2> ….


OBJECT=main.o print.o sum.oCC=gccVPATH=main:sum:printCFLAGS=-Imain -Isum -Iprintapp:$(OBJECT)  $(CC) $^ -o $@
复制代码


include 关键字


用法: include <路径或者具体的文件>

任务 3:Shell 脚本语言

Linux 下常用的脚本语言。


【1】变量、数组、for、while、函数、运算符、if、……..


[root@wbyq /]# ls /bin/sh -l
lrwxrwxrwx. 1 root root 4 12月 27 2016 /bin/sh -> bash
复制代码


【2】变量定义使用


#!/bin/bash
ABC=12345
echo "ABC=$ABC"
echo "ABC=${ABC}"
复制代码


【3】Shell 脚本传递参数 类似于 C 语言的 argv argc


#!/bin/bash
echo "cnt=$#"
echo "[0]=$0"
echo "[1]=$1"
echo "[2]=$2"
echo "[3]=$3"
复制代码


【4】if 语句语法规则


#!/bin/bash
a=10
b=20
if [ $a -eq $b ]
then
echo "123"
else
echo "456"
fi
复制代码


【5】计算字符串长度


#!/bin/bash
string="abcd"
echo ${#string} #输出 4
复制代码


【6】数组语法


#!/bin/bash
buff=(1 2 3 4 5 6 7 8 9)
buff[0]=88
buff[1]=99
buff[100]=100
buff[88]=55
echo "buff[0]=${buff[0]}"
echo "buff[1]=${buff[1]}"
echo "buff[2]=${buff[2]}"
echo "buff[100]=${buff[100]}"
复制代码


【7】echo 用法示例


#!/bin/bash
DATA=12345
echo "DATA=${DATA}"
复制代码


【8】从键盘上读取数据


#!/bin/bash
echo -n "输入数据:" #参数-n 的作用是不换行, echo 默认是换行
read data #从键盘输入
echo "你输入的数据为: $data" #显示信息
复制代码


【9】printf 格式打印


#!/bin/bash
printf "%d\n" 1234
printf "%s\n" "45678"
复制代码


知识点总结:


#!/bin/bash
#if使用方式1if [ 1 -eq 2 -o 1 -lt 5 ]then echo "条件为真"else echo "条件为假"fi
#if使用方式2if((1==2 || 1==1))then echo "条件为真"else echo "条件为假"fi
#for循环的使用方式1for i in 1 2 3 4 5do echo "i=$i"done
#for循环的使用方式2for((i=0;i<5;i++))do echo "i=$i"done

#while循环的使用方式1i=0while [ $i -lt 5 ]do #i=`expr $i + 1` let i=i+1+34-4 #算术运算 echo "i=$i"done

#while循环的使用方式2i=10while((i<15))do ((i++)) echo "i=$i"done

#数组当做函数的形参进行传递func(){ echo ${buff[0]} echo ${buff[1]} echo ${buff[2]} echo ${buff[3]}}
buff[0]=abuff[1]=bbuff[2]=cbuff[3]=d
func ${buff[*]} #数组的传递

#获取命令的执行状态
#方式1 (获取返回值)data=`ls -l` echo "data1=$data"
#方式2 (获取命令执行状态)ls -lecho "data2=$?"
复制代码


Shell 脚本练习:


【1】从键盘上输入年份,判断平年闰年。


#!/bin/bashecho -n "输入一个年份:"  #参数-n 的作用是不换行, echo 默认是换行read year  #从键盘输入值存放到year中
#判断闰年与平年if [ $(expr ${year} % 4) -eq 0 -a $(expr ${year} % 100) -ne 0 ] || [ $(expr ${year} % 400) -eq 0 ]thenecho "${year} 是闰年"elseecho "${year} 是平年"fi

#说明: if语句里两个独立的表达式可以使用
复制代码


【2】输出 9*9 乘法口诀表


#!/bin/bash#输出9*9乘法口诀表i=1j=1while [ $i -le 9 ]  #le判断左边是否小于等于右边的do  while [ $j -le $i ]  do    printf "%d*%d=%d " $i $j `expr $i '*' $j`    j=`expr $j + 1`  done  printf "\n"  j=1  i=`expr $i + 1`done
复制代码


【3】冒泡排序。


#!/bin/bashecho -n "请输入排序数据的数量:" read max_cnt
echo -n "请输入数据(输入一个数据按下回车键)"
cnt=0while [ $cnt -lt $max_cnt ]do read buff[$cnt] #((cnt++)) cnt=`expr $cnt + 1`doneecho "数组的数据=${buff[*]}"

#实现冒泡排序max_cnt=`expr $max_cnt - 1`
i=0j=0tmp=0while [ $i -lt $max_cnt ]do while [ $j -lt $max_cnt ] do if [ ${buff[$j]} -lt ${buff[`expr $j + 1`]} ] then tmp=${buff[$j]} buff[$j]=${buff[`expr $j + 1`]} buff[`expr $j + 1`]=$tmp fi j=`expr $j + 1` done j=0 i=`expr $i + 1`done
echo "排序之后的数据=${buff[*]}"
复制代码


发布于: 刚刚阅读数: 4
用户头像

DS小龙哥

关注

之所以觉得累,是因为说的比做的多。 2022.01.06 加入

熟悉C/C++、51单片机、STM32、Linux应用开发、Linux驱动开发、音视频开发、QT开发. 目前已经完成的项目涉及音视频、物联网、智能家居、工业控制领域

评论

发布
暂无评论
Linux开发_Makefile规则与Shell脚本语言_6月月更_DS小龙哥_InfoQ写作社区