介绍交叉编译器静态库、动态库的编译方式;介绍 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=gcc
VPATH=./abc
app:print.o main.o sum.o
$(CC) $^ -o $@
%.o:%.c
$(CC) $< -o $@ -c
clean:
rm ./*.o app -rf
复制代码
【2】Makefile 自动化编译
需要创建 3 个目录,每个目录下各有一个.c 一个.h,一个 Makefile 文件
在顶层目录下创建一个 Makefile 文件,实现自动化编译。
特殊符号:
冒号用法: <目标文件>:<依赖文件 1> <依赖文件 2> ….
OBJECT=main.o print.o sum.o
CC=gcc
VPATH=main:sum:print
CFLAGS=-Imain -Isum -Iprint
app:$(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使用方式1
if [ 1 -eq 2 -o 1 -lt 5 ]
then
echo "条件为真"
else
echo "条件为假"
fi
#if使用方式2
if((1==2 || 1==1))
then
echo "条件为真"
else
echo "条件为假"
fi
#for循环的使用方式1
for i in 1 2 3 4 5
do
echo "i=$i"
done
#for循环的使用方式2
for((i=0;i<5;i++))
do
echo "i=$i"
done
#while循环的使用方式1
i=0
while [ $i -lt 5 ]
do
#i=`expr $i + 1`
let i=i+1+34-4 #算术运算
echo "i=$i"
done
#while循环的使用方式2
i=10
while((i<15))
do
((i++))
echo "i=$i"
done
#数组当做函数的形参进行传递
func()
{
echo ${buff[0]}
echo ${buff[1]}
echo ${buff[2]}
echo ${buff[3]}
}
buff[0]=a
buff[1]=b
buff[2]=c
buff[3]=d
func ${buff[*]} #数组的传递
#获取命令的执行状态
#方式1 (获取返回值)
data=`ls -l`
echo "data1=$data"
#方式2 (获取命令执行状态)
ls -l
echo "data2=$?"
复制代码
Shell 脚本练习:
【1】从键盘上输入年份,判断平年闰年。
#!/bin/bash
echo -n "输入一个年份:" #参数-n 的作用是不换行, echo 默认是换行
read year #从键盘输入值存放到year中
#判断闰年与平年
if [ $(expr ${year} % 4) -eq 0 -a $(expr ${year} % 100) -ne 0 ] || [ $(expr ${year} % 400) -eq 0 ]
then
echo "${year} 是闰年"
else
echo "${year} 是平年"
fi
#说明: if语句里两个独立的表达式可以使用
复制代码
【2】输出 9*9 乘法口诀表
#!/bin/bash
#输出9*9乘法口诀表
i=1
j=1
while [ $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/bash
echo -n "请输入排序数据的数量:"
read max_cnt
echo -n "请输入数据(输入一个数据按下回车键)"
cnt=0
while [ $cnt -lt $max_cnt ]
do
read buff[$cnt]
#((cnt++))
cnt=`expr $cnt + 1`
done
echo "数组的数据=${buff[*]}"
#实现冒泡排序
max_cnt=`expr $max_cnt - 1`
i=0
j=0
tmp=0
while [ $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[*]}"
复制代码
评论