软链接概述

软链接是Linux下常用的一种共享文件方式、目录的方式,这种方式类似于Windows下的快捷方式。一般一个文件或者目录在不同的路径都需要的时候,可以通过创建软链接的方式来共享,这样只系统下面只有一份源文件、目录。另外,巧用软链接,可以大大增加应用程序的可移植性。

软链接创建与删除

软链接创建与删除比较简单,使用ln命令创建链接文件,格式如下:

ln  -s  [源文件或目录]  [目标文件或目录]

示例:

建立一个指向/usr/local/www的软链接到/tmp下面:

$: ln -s /usr/local/www /tmp/www
$: ls /tmp/www -l
$: lrwxrwxrwx 1 fens fens 14 9月 12 08:56 www -> /usr/local/www

删除软链接:

rm /tmp/www

注意: 删除的时候,如果是目录,结尾时,不要加“/”,不然会把指向的目录给删掉!

软链接使用技巧

共享目录文件

一般做嵌入式Linux开发,linux的虚拟机都会安装好多平台的交叉编译器,这些编译器可能会用到一些库,库在使用的时候,需要将头文件放到编译器的路径下面,这样程序编译的时候,会自动找到头文件,这里以boost库为例。

下面是我的虚拟机里:

drwxr-xr-x 12 1007 users 4.0K 7月  18  2019 arm-himix200-linux
drwxr-xr-x 9 root root 4.0K 1月 24 2017 arm-hisiv300-linux
drwxr-xr-x 10 520 520 4.0K 5月 5 2019 arm-hisiv500-linux
drwxr-xr-x 10 520 520 4.0K 6月 9 10:30 arm-hisiv600-linux

boost库由于85%的模块只需要引用头文件就可以使用,所以使用也比较方便,不用编译;所以库文件也比较大,在每一种编译器下都会使用,通过建软链接的方式共享文件,也减少了磁盘空间占用,下面是我建立的软链接:

$ls arm-himix200-linux/target/usr/include/boost -l
lrwxrwxrwx 1 root root 10 7月 19 2018 arm-himix200-linux/target/usr/include/boost -> /opt/boost $ls arm-hisiv300-linux/target/usr/include/boost -l
lrwxrwxrwx 1 root root 10 5月 12 2018 arm-hisiv300-linux/target/usr/include/boost -> /opt/boost $ls arm-hisiv500-linux/target/usr/include/boost -l
lrwxrwxrwx 1 root root 10 7月 30 2019 arm-hisiv500-linux/target/usr/include/boost -> /opt/boost $ls arm-hisiv600-linux/target/usr/include/boost -l
lrwxrwxrwx 1 root root 10 7月 30 2019 arm-hisiv600-linux/target/usr/include/boost -> /opt/boost

统一设备文件名,增强应用程序可移植性

不同平台的嵌入式Linux下,可能设备文件名、GPIO编号不一样,比如有的平台下,串口设备名称为:ttySxx, 有的则是ttyAMAxx;这个产品的运行指示灯是gpio51控制,另一个产品是gpio32等。

所以不同平台的应用程序中要么加编译开关,宏定义来区分不同平台的设备文件名称,这样会导致代码臃肿,可读性查,不同平台需要不同编译开关,容易出错。

而使用软链接可以很好的解决这一问题,可以自己创建一个dev目录(位置自己定),我习惯和应用程序放在同级目录下。

然后将这些设备文件用软链接来统一名称如:

平台1:

$ cd /usr/local/dev
$ ln -s /dev/ttyS1 ./com1
$ ln -s /dev/ttyS2 ./com2
$ ln -s /dev/ttyS3 ./com3
$ ln -s /sys/class/leds/led_orange/brightness ./runLed
$ ln -s /sys/class/gpio/gpio211/value ./powerLed
$ ls -l
#忽略我错误的时间
lrwxrwxrwx 1 fens fens 10 1月 1 2000 com1 -> /dev/ttyS1
lrwxrwxrwx 1 fens fens 10 1月 1 2000 com2 -> /dev/ttyS2
lrwxrwxrwx 1 fens fens 11 1月 1 2000 com3 -> /dev/ttyS3
lrwxrwxrwx 1 fens fens 29 1月 1 2000 power -> /sys/class/gpio/gpio211/value
lrwxrwxrwx 1 fens fens 37 1月 1 2000 runLed -> /sys/class/gpio/gpio212/value

平台2:

$ cd /usr/local/dev
$ ln -s /dev/ttyAMA1 ./com1
$ ln -s /dev/ttyAMA2 ./com2
$ ln -s /dev/ttyAMA3 ./com3
$ ln -s /sys/class/leds/led_orange/brightness ./runLed
$ ln -s /sys/class/gpio/gpio211/value ./powerLed
$ ls -l
#忽略我错误的时间
lrwxrwxrwx 1 fens fens 10 1月 1 2000 com1 -> /dev/ttyAMA1
lrwxrwxrwx 1 fens fens 10 1月 1 2000 com2 -> /dev/ttyAMA2
lrwxrwxrwx 1 fens fens 11 1月 1 2000 com3 -> /dev/ttyAMA3
lrwxrwxrwx 1 fens fens 29 1月 1 2000 power -> /sys/class/gpio/gpio41/value
lrwxrwxrwx 1 fens fens 37 1月 1 2000 runLed -> /sys/class/gpio/gpio42/value

这样只需要增加一个创建软链接的脚本,在系统启动的时候调用一下,就可以解决不同平台设备文件不一样的问题,应用程序不用修改,驱动也不用改。

在实际应用中,还有更多技巧有待大家去探索,这里只是抛砖引玉,有比较好的技巧也可以在下面留言里留下来,一起交流学习!

微信公众号:fensnote

欢迎关注:

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200912093139186.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1cXVhbl8xMjMw,size_16,color_FFFFFF,t_70#pic_center =500x250)

嵌入式Linux软链接使用技巧的更多相关文章

  1. 嵌入式linux驱动开发之给linux系统添加温度传感器模块

    忙了几天,终于可以让ds18b20在自己的开发板的linux系统上跑了!虽然ds18b20不是什么新鲜玩意,但是想想知己可以给linux系统添加模块了还是有点小鸡冻呢! 虽然说现在硬件的资源非常丰富而 ...

  2. 嵌入式Linux开发教程:Linux常见命令(上篇)

    摘要:这是对周立功编著的<嵌入式Linux开发教程>的第7期连载.本期刊载内容有关LinuxLinux常见命令中的导航命令.目录命令和文件命令.下一期将连载网络操作命令.安装卸载文件系统等 ...

  3. 基于s5pv210嵌入式linux系统sqlite3数据库移植

    基于s5pv210嵌入式linux系统sqlite3数据库移植 1.下载源码 http://www.sqlite.org/download.html 最新源码为3080100 2.解压 tar xvf ...

  4. zedboard 构建嵌入式linux

    本文通过五部完成zedboard的嵌入式LINUX搭建,所谓磨刀不五砍材工嘛 1:系统环境搭建 要准备好交叉编译环境 见http://blog.csdn.net/xiabodan/article/de ...

  5. 【转】嵌入式Linux学习笔记

    一  嵌入式系统定义: 应用于特定环境的硬件体系. 二  两样非常重要的能力: 1.  掌握各种新概念的能力 2.  调试的能力( 包括软件, 硬件 ) 三  需要的基础知识: 1.  操作系统理论基 ...

  6. 《嵌入式Linux内存使用与性能优化》笔记

    这本书有两个关切点:系统内存(用户层)和性能优化. 这本书和Brendan Gregg的<Systems Performance>相比,无论是技术层次还是更高的理论都有较大差距.但是这不影 ...

  7. 嵌入式Linux学习(一)

    嵌入式系统 嵌入式系统是一种专用的计算机系统,作为装置或设备的一部分.通常,嵌入式系统是一个控制程序存储在ROM中的嵌入式处理器控制板.事实上,所有带有数字接口的设备,如手表.微波炉.录像机.汽车等, ...

  8. 【重磅推荐】嵌入式Linux经典书单(部分含视频)

    一直都有人问我要书单,在网上搜索大半天,没找到合适的,他们写的太不负责了,遂决定自己整理. 本书单综合了豆瓣知乎热评,尤其参考了一线开发者韦东山学员群的小伙伴们的意见, 再结合本人多年答疑经验整理而成 ...

  9. gdbserver远程调试嵌入式linux应用程序方法

    此处所讲的是基于gdb和gdbsever的远程调试方法.环境为:PC机:win7.虚拟机:10.04.下位机:飞嵌TE2440开发板. 嵌入式linux应用程序的开发一般都是在linux里面编写好代码 ...

随机推荐

  1. java List接口二

    一 ArrayList集合 ArrayList集合数据存储的结构是数组结构.元素增删慢,查找快,由于日常开发中使用最多的 功能为查询数据.遍历数据,所以ArrayList是最常用的集合. 许多程序员开 ...

  2. 如何实现数据库CDP,即数据库连续数据保护

    备份可以分为定期备份和实时备份.定期备份与实时备份相比存在两大劣势:一是备份需要时间窗口,对于很多24小时业务运行的机构,线上业务不允许有过多的业务系统停机去进行数据备份:二是定期备份无法保证数据丢失 ...

  3. C++中简单程序出现Segmentation fault (core dumped)段错误

    段错误就是指访问的内存超出了系统所给这个程序的内存空间.一般是随意使用野指针或者数组.数组越界. ------两种简单解决方法:1.利用GDB调试,定位出错位置.(具体可查找博客详细学习)2.在可能出 ...

  4. C#LeetCode刷题之#728-自除数(Self Dividing Numbers)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3889 访问. 自除数 是指可以被它包含的每一位数除尽的数. 例如 ...

  5. golang bool值

    目录 前言 1.基本介绍 2.类型转换 3.使用: 跳转 前言 不做文字的搬运工,多做灵感性记录 这是平时学习总结的地方,用做知识库 平时看到其他文章的相关知识,也会增加到这里 随着学习深入,会进行知 ...

  6. K8S 创建管理员账号

    一.生成管理员证书 cat > admin-csr.json <<EOF { "CN": "admin", "hosts" ...

  7. PythonCrashCourse 第二章习题

    2.3 个性化消息:将用户的姓名存到一个变量中,并向该用户显示一条消息.显示的消息应非常简单,如"Hello Eric, would you like to learn some Pytho ...

  8. 第6篇scrum冲刺(5.26)

    一.站立会议 1.照片 2.工作安排 成员 昨天已完成的工作 今天的工作安排 困难 陈芝敏   研究云开发,更新了登录模块,把用户的信息传入数据库了  学习云开发,云函数调用以及数据的前后端传递  遇 ...

  9. Java算法——递归思想

    描述递归(recursion):程序调用自身的编程技巧. 递归满足2个条件:1)有反复执行的过程(调用自身)2)有跳出反复执行过程的条件(递归出口) 递归与栈的关系下面演示的是求n的阶乘 int Fa ...

  10. 区块链入门到实战(18)之以太坊(Ethereum) – 什么是智能合约

    作用:提供优于传统合约的安全方法,并减少与合约相关的其他交易成本. 以太坊网络基石:以太坊虚拟币和智能合约. 智能合约(Smart contract )是一种旨在以信息化方式传播.验证或执行合同的计算 ...