嵌入式Linux軟鏈接使用技巧

軟鏈接概述

軟鏈接是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