歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> linux系統開發 1 基礎apt

linux系統開發 1 基礎apt

日期:2017/3/3 11:00:34   编辑:Linux技術
本文謝絕轉載,原文來自http://990487026.blog.51cto.com
<大綱>

linux開發基礎
	od -tc 查看文件所有字符
	顯示硬件信息:
		lshw
	apt-get操作:
		軟件包搜索:apt-cache search vim
		顯示軟件包信息 apt-cache show vim
	進程:
		who
		ps
		ps aux
	作業號:
		ctrl + z 丟到後台,停止運行
		fg 1	調到前台,開始運行
		bg 2	調到後台,開始運行
		kill
	環境變量:
		env
		PATH
		finger 用戶信息
安裝vsftpd
	安裝
	登陸
	下載
	上傳
VIM
	命令模式
	vim分屏操作
	調整屏幕尺寸
	vim 進制切換
gcc
	gcc -I指定頭文件的位置
	gcc -DDEBUG 定義宏參數
	nm 查看符號表
	objdump反匯編
	ldd 查看程序依賴哪些庫
	共享庫簡介
	靜態庫實例
	共享庫實例

查看文件所有字符
2016-08-01_14:58:52chunli@http://990487026.blog.51cto.com~/linux_c$ od -tc main.c 
0000000   #   i   n   c   l   u   d   e       <   s   t   d   i   o   .
0000020   h   >  \n  \n   i   n   t       m   a   i   n   (   v   o   i
0000040   d   )  \n   {  \n  \t   p   r   i   n   t   f   (   "   %   d
0000060   \   n   "   ,   a   d   d   (   2   ,   4   )   )   ;  \n  \t
0000100   p   r   i   n   t   f   (   "   %   d   \   n   "   ,   d   i
0000120   v   (   8   ,   3   )   )   ;  \n  \t   r   e   t   u   r   n
0000140       0   ;  \n   }  \n  \n
0000147

apt-get操作
軟件包搜索:$ apt-cache search vim
軟件包信息:$ apt-cache show vim
解壓到指定的文件路徑:$ tar xf linux-4.6.tar.gz -C haha/
踢人下線
chunli@http://990487026.blog.51cto.com~$ ps
   PID TTY          TIME CMD
  3585 pts/0    00:00:00 bash
  3899 pts/0    00:00:00 ps
chunli@http://990487026.blog.51cto.com~$ who
chunli   pts/0        2016-07-27 02:19 (10.11.12.1)
chunli   pts/1        2016-07-27 02:47 (10.11.12.1)
chunli@http://990487026.blog.51cto.com~$

列出所有進程:
chunli@http://990487026.blog.51cto.com~$ ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.4  33656  4076 ?        Ss   Jul26   0:02 /sbin/init
root          2  0.0  0.0      0     0 ?        S    Jul26   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    Jul26   0:00 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?        S<   Jul26   0:00 [kworker/0:0H]
root          7  0.0  0.0      0     0 ?        S    Jul26   0:04 [rcu_sched]
root          8  0.0  0.0      0     0 ?        S    Jul26   0:00 [rcu_bh]

作業號:
ctrl + z 丟到後台,停止運行
fg 1調到前台,開始運行
bg 2調到後台,開始運行
kill
kill;
chunli@http://990487026.blog.51cto.com~$ kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	
chunli@http://990487026.blog.51cto.com~$

環境變量:
chunli@http://990487026.blog.51cto.com~$ env
XDG_SESSION_ID=2
TERM=xterm
SHELL=/bin/bash
SSH_CLIENT=10.11.12.1 8045 22
OLDPWD=/dev
SSH_TTY=/dev/pts/0
USER=chunli
LD_LIBRARY_PATH=:.
MAIL=/var/mail/chunli
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
PWD=/home/chunli
LANG=en_US.UTF-8
SHLVL=1
HOME=/home/chunli
LANGUAGE=en_US:en
LOGNAME=chunli
SSH_CONNECTION=10.11.12.1 8045 10.11.12.4 22
XDG_RUNTIME_DIR=/run/user/1000
_=/usr/bin/env
chunli@http://990487026.blog.51cto.com~$

添加用戶:
chunli@http://990487026.blog.51cto.com~$ sudo useradd -s /bin/bash -g chunli -d /home/xioaming -m xiaoming

finger 用戶信息
chunli@http://990487026.blog.51cto.com~$ finger chunli
Login: chunli         			Name: chunli
Directory: /home/chunli             	Shell: /bin/bash
On since Wed Jul 27 02:24 (CST) on tty1    7 hours 56 minutes idle
On since Wed Jul 27 02:19 (CST) on pts/0 from 10.11.12.1
   7 seconds idle
On since Wed Jul 27 02:47 (CST) on pts/1 from 10.11.12.1
   7 hours 34 minutes idle
No mail.
No Plan.
chunli@http://990487026.blog.51cto.com~$

安裝vsftpd:
ubuntu14.04
chunli@ubuntu:~$ sudo apt-get install vsftpd
chunli@ubuntu:~$ echo $?

chunli@ubuntu:~$ sudo mkdir /home/ftp
chunli@ubuntu:~$ sudo chmod 777 /home/ftp/

chunli@ubuntu:~$ vim /etc/vsftpd.conf 
listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key

chunli@ubuntu:~$ sudo service vsftpd restart
chunli@ubuntu:~$ netstat -tnlp
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN      -               

登陸:chunli@ubuntu:~$ ftp 10.11.12.4
Name (10.11.12.4:chunli): chunli

ftp> ls 
drwxrwxr-x    2 1000     1000         4096 Jul 29 13:32 c++

使用二進制傳輸
ftp> bin
200 Switching to Binary mode.

文件下載:
ftp> ls
-rw-rw-r--    1 1000     1000            5 Jul 29 13:47 hello.txt
ftp> get hello.txt

文件上傳:
ftp> put 123 
ftp> ls -l
rw-r--r--    1 1000     1000            0 Jul 29 14:23 123
-rw-rw-r--    1 1000     1000           60 Jul 29 14:22 ll

quit,exit,bye結束

ftp缺點:不可以下載一個目錄

VIM
命令模式:
M: 光標移動到中間行
L: 光標移動到屏幕最後一行行首
G: 移動到指定行,行號 -G
w: 向後一次移動一個字
b: 向前一次移動一個字
{: 按段移動,上移
}: 按段移動,下移
Ctr-d: 向下翻半屏
Ctr-u: 向上翻半屏
Ctr-f: 向下翻一屏
Ctr-b: 向上翻一屏
gg: 光標移動文件開頭
G: 光標移動到文件末尾
gg=G:所有代碼縮進

刪除命令:
x: 刪除光標後一個字符,相當於 Del
X: 刪除光標前一個字符,相當於 Backspace
dd: 刪除光標所在行,n dd 刪除指定的行數 D: 刪除光標後本行所有內容,包含光標所在字符
d0: 刪除光標前本行所有內容,不包含光標所在字符
dw: 刪除光標開始位置的字,包含光標所在字符

撤銷命令:
u: 一步一步撤銷
U: 一次性撤銷當前行所作的所有操作
Ctr-r: 反撤銷

重復命令:
.: 重復上一次操作的命令

文本行移動:
>>: 文本行右移
<<: 文本行左移

復制粘貼:
yy: 復制當前行,n yy 復制 n 行
p: 在光標所在位置向下新開辟一行,粘貼

可視模式:
v: 按字符移動,選中文本
V: 按行移動,選中文本可視模式可以配合 d, y, >>, << 實現對文本塊的刪除,復制,左右移動

替換操作:
r: 替換當前字符
R: 替換當前行光標後的字符

查找命令:
/: str查找
n: 下一個
N:上一個

vim分屏操作
分屏操作:
sp: 上下分屏,後可跟文件名
vsp: 左右分屏,後可跟文件名
Ctr+w+w: 在多個窗口切換

啟動分屏:
1.使用大寫O參數進行垂直分屏
$ vim -On file1 file2 ...
2.使用小寫o參數進行水平分屏
$ vim -on file1 file2 ...
注: n是數字,表示分屏的數量,n要大於等於文件個數

關閉分屏
1.關閉當前窗口
ctrl+w c

2.關閉當前窗口,如果只剩最後一個,則退出vim
ctrl+w q

編輯中分屏
1.上下分割當前打開的文件
ctrl+w s

2.上下分割,並打開一個新的文件
:sp filename

3.左右分割當前打開的文件
ctrl+w v

4.左右分割,並打開一個新的文件
:vsp filename

分屏編輯中光標的移動
vi中的光標鍵是h,j,k,l,要在各個屏之間切換,只需要先按一下ctrl+w
ctrl+w k 把光標移動到上邊的屏
ctrl+w j 把光標移動到下邊的屏
ctrl+w l 把光標移動到右邊的屏
ctrl+w h 把光標移動到左邊的屏
ctrl+w w 把光標移動到下一個的屏

移動分屏
1.向上移動 ctrl+w K
2.向下移動 ctrl+w J
3.向右移動 ctrl+w L
4.向左移動 ctrl+w H

屏幕尺寸
1.增加高度 ctrl+w +
2.減少高度 ctrl+w -
3.所有屏的高度一致 ctrl+w =
4.左加寬度 ctrl+w >
5.右加寬度 ctrl+w <
6.右增加n寬 (如:n=30) ctrl+w n < [實用]

光標fopen 按3 shift + k:查看函數的定義 ,相當於man 3 fopen

vim 進制
:%!xxd 以16進制編輯
:%!xxd -r 回到正常模式編輯

vim ide
ctag

查看gcc版本
chunli@ubuntu:~$ gcc -v
gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3) 
chunli@ubuntu:~$ 
有些項目的開發需要指定版本的編譯器

gcc -I指定頭文件的位置:
chunli@ubuntu:~$ gcc -I/tmp/  main.c 
chunli@ubuntu:~$ cat main.c 
#include <stdio.h>
#include "test.h"

int main(void)
{
	return 0;
}
chunli@ubuntu:~$ ll /tmp/
total 4
-rw-rw-r-- 1 chunli chunli 2 Jul 30 15:29 test.h
chunli@ubuntu:~$ gcc -I/tmp/  main.c 
chunli@ubuntu:~$

gcc -DDEBUG 定義宏參數
chunli@ubuntu:~$ cat main.c 
#include <stdio.h>
int main(void)
{
	#ifdef DEBUG
		printf("hello \n");
	#endif

	return 0;
}

chunli@ubuntu:~$ gcc -DDEBUG main.c 
chunli@ubuntu:~$ ./a.out 
hello 
chunli@ubuntu:~$

-E參數:預編譯
chunli@ubuntu:~$ gcc -DDEBUG  -E main.c -o main.i
chunli@ubuntu:~$ cat main.i

nm 查看符號表
chunli@ubuntu:~$ nm a.out 
0000000000601040 B __bss_start
0000000000601040 b completed.6973
0000000000601030 D __data_start
0000000000601030 W data_start
0000000000400470 t deregister_tm_clones
00000000004004e0 t __do_global_dtors_aux
0000000000600e18 t __do_global_dtors_aux_fini_array_entry
0000000000601038 D __dso_handle
0000000000600e28 d _DYNAMIC
0000000000601040 D _edata
0000000000601048 B _end
00000000004005c4 T _fini
0000000000400500 t frame_dummy
0000000000600e10 t __frame_dummy_init_array_entry
0000000000400700 r __FRAME_END__
0000000000601000 d _GLOBAL_OFFSET_TABLE_
                 w __gmon_start__
00000000004003e0 T _init
0000000000600e18 t __init_array_end
0000000000600e10 t __init_array_start
00000000004005d0 R _IO_stdin_used
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
0000000000600e20 d __JCR_END__
0000000000600e20 d __JCR_LIST__
                 w _Jv_RegisterClasses
00000000004005c0 T __libc_csu_fini
0000000000400550 T __libc_csu_init
                 U __libc_start_main@@GLIBC_2.2.5
000000000040052d T main
                 U puts@@GLIBC_2.2.5
00000000004004a0 t register_tm_clones
0000000000400440 T _start
0000000000601040 D __TMC_END__
chunli@ubuntu:~$

objdump反匯編
chunli@ubuntu:~$ objdump -dSsx a.out 

a.out:     file format elf64-x86-64
a.out
architecture: i386:x86-64, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x0000000000400440

Program Header:
    PHDR off    0x0000000000000040 vaddr 0x0000000000400040 paddr 0x0000000000400040 align 2**3
         filesz 0x00000000000001f8 memsz 0x00000000000001f8 flags r-x
  INTERP off    0x0000000000000238 vaddr 0x0000000000400238 paddr 0x0000000000400238 align 2**0
         filesz 0x000000000000001c memsz 0x000000000000001c flags r--
    LOAD off    0x0000000000000000 vaddr 0x0000000000400000 paddr 0x0000000000400000 align 2**21
         filesz 0x0000000000000704 memsz 0x0000000000000704 flags r-x
    LOAD off    0x0000000000000e10 vaddr 0x0000000000600e10 paddr 0x0000000000600e10 align 2**21
         filesz 0x0000000000000230 memsz 0x0000000000000238 flags rw-
 DYNAMIC off    0x0000000000000e28 vaddr 0x0000000000600e28 paddr 0x0000000000600e28 align 2**3
         filesz 0x00000000000001d0 memsz 0x00000000000001d0 flags rw-
    NOTE off    0x0000000000000254 vaddr 0x00000

ldd 查看程序依賴哪些庫
chunli@ubuntu:~$ cat main.c 
#include <stdio.h>
int main(void)
{
	printf("hello \n");
	return 0;
}

chunli@ubuntu:~$ gcc  main.c && ./a.out 
hello 
chunli@ubuntu:~$ ldd ./a.out 
	linux-vdso.so.1 =>  (0x00007ffc93dad000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6c61011000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f6c613d6000)
chunli@ubuntu:~$

共享庫簡介:
chunli@ubuntu:~$ cat add.c 
int add(int a,int b)
{
	return a+b;
}

chunli@ubuntu:~$ gcc -fPIC -c add.c 
chunli@ubuntu:~$ ls -l
-rw-rw-r-- 1 chunli chunli       38 Jul 30 16:51 add.c
-rw-rw-r-- 1 chunli chunli     1232 Jul 30 16:51 add.o

後面可以接多個o文件
chunli@ubuntu:~$ gcc -shared -Wl,-soname,libmyadd.so.1 -o libmyadd.so.1.10 add.o 
chunli@ubuntu:~$ ll
-rw-rw-r-- 1 chunli chunli       38 Jul 30 16:51 add.c
-rw-rw-r-- 1 chunli chunli     1232 Jul 30 16:51 add.o
-rwxrwxr-x 1 chunli chunli     7853 Jul 30 16:56 libmyadd.so.1.10*

寫個主函數,來調用
chunli@ubuntu:~$ cat main.c 
#include <stdio.h>

int main(void)
{
	printf("%d\n",add(2,4));
	return 0;
}

chunli@ubuntu:~$ gcc  main.c libmyadd.so.1.10
運行時出錯 
chunli@ubuntu:~$ ./a.out 
./a.out: error while loading shared libraries: libmyadd.so.1: cannot open shared object file: No such file or directory
chunli@ubuntu:~$ 

查看程序的依賴:可以看到not found
chunli@ubuntu:~$ ldd ./a.out 
	linux-vdso.so.1 =>  (0x00007ffe9c99c000)
	libmyadd.so.1 => not found
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9c35e4c000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f9c36211000)
chunli@ubuntu:~$ 

【問題解決】修改ld.so.conf
追加一行動態庫的路徑
libmyadd.so.1.10 在 /home/chunli目錄下
chunli@ubuntu:~$ cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf
/home/chunli

更新 ldconfig -v
chunli@ubuntu:~$ sudo ldconfig -v
生成了soname,指向realname
chunli@ubuntu:~$ ll
lrwxrwxrwx 1 root   root         16 Jul 30 17:22 libmyadd.so.1 -> libmyadd.so.1.10*
-rwxrwxr-x 1 chunli chunli     7853 Jul 30 17:00 libmyadd.so.1.10*

再次執行
chunli@ubuntu:~$ ./a.out 
6

linkname的制作,都指向realname 
chunli@ubuntu:~$ ln -s libmyadd.so.1.10 libadd.so
chunli@ubuntu:~$ ll
lrwxrwxrwx 1 chunli chunli       16 Jul 30 18:23 libadd.so -> libmyadd.so.1.10*
lrwxrwxrwx 1 root   root         16 Jul 30 17:22 libmyadd.so.1 -> libmyadd.so.1.10*
-rwxrwxr-x 1 chunli chunli     7853 Jul 30 17:00 libmyadd.so.1.10*

靜態庫實例
源文件:

2016-08-01_14:06:13 chunli@http://990487026.blog.51cto.com~/linux_c$ cat src/add.c 
int add(int a,int b)
{
	return a+b;
}

2016-08-01_14:06:22 chunli@http://990487026.blog.51cto.com~/linux_c$ cat src/div.c 
int div(int a,int b)
{
	if(b == 0)
	{
		return -1;
	}
	return a/b;
}

2016-08-01_14:06:25 chunli@http://990487026.blog.51cto.com~/linux_c$ cat main.c 
#include <stdio.h>

int main(void)
{
	printf("%d\n",add(2,4));
	printf("%d\n",div(8,3));
	return 0;
}

2016-08-01_14:04:57 chunli@http://990487026.blog.51cto.com~/linux_c$ tree
.
├── lib
├── main.c
└── src
    ├── add.c
    └── div.c

 src是源代碼
 lib是編譯好的庫
 main.c是測試程序

編譯庫文件,與位置無關
2016-08-01_14:07:31 chunli@http://990487026.blog.51cto.com~/linux_c$ cd src/
2016-08-01_14:07:33 chunli@http://990487026.blog.51cto.com~/linux_c/src$ gcc -c -fPIC *.c
2016-08-01_14:07:47 chunli@http://990487026.blog.51cto.com~/linux_c/src$ ls
add.c  add.o  div.c  div.o

做一個靜態庫:
2016-08-01_14:07:50 chunli@http://990487026.blog.51cto.com~/linux_c/src$ ar rcs libmycal.a *.o
2016-08-01_14:11:03 chunli@http://990487026.blog.51cto.com~/linux_c/src$ ls
add.c  add.o  div.c  div.o  libmycal.a

nm查看一下靜態庫裡面有什麼,只是把2個.o文件歸檔到一起
2016-08-01_14:11:38 chunli@http://990487026.blog.51cto.com~/linux_c/src$ nm libmycal.a 
add.o:
0000000000000000 T add
div.o:
0000000000000000 T div

開始main的測試程序
2016-08-01_14:14:04chunli@http://990487026.blog.51cto.com~/linux_c/src$ cd ..
2016-08-01_14:14:40 chunli@http://990487026.blog.51cto.com~/linux_c$ mv src/libmycal.a  lib/
2016-08-01_14:15:23 chunli@http://990487026.blog.51cto.com~/linux_c$ tree
.
├── lib
│   └── libmycal.a
├── main.c
└── src
    ├── add.c
    ├── add.o
    ├── div.c
    └── div.o

靜態庫已經編譯到程序之中,可以直接運行
優點:復制到任意linux,都可以運行
缺點:文件過大
編譯運行:
2016-08-01_14:15:44 chunli@http://990487026.blog.51cto.com~/linux_c$ gcc main.c  lib/libmycal.a 
2016-08-01_14:15:52 chunli@http://990487026.blog.51cto.com~/linux_c$ ./a.out 
6
2

2016-08-01_14:21:44chunli@http://990487026.blog.51cto.com~/linux_c$ ll ./a.out 
-rwxrwxr-x 1 chunli chunli 8.5K Aug  1 14:15 ./a.out*

2016-08-01_14:21:57chunli@http://990487026.blog.51cto.com~/linux_c$ size ./a.out 
   text	   data	    bss	    dec	    hex	filename
   1438	    560	      8	   2006	    7d6	./a.out

查看程序的依賴
2016-08-01_14:22:00chunli@http://990487026.blog.51cto.com~/linux_c$ ldd ./a.out 
	linux-vdso.so.1 =>  (0x00007ffd9439b000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd610550000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fd610915000)

共享庫實例
文件目錄:
2016-08-01_14:30:43chunli@http://990487026.blog.51cto.com~/linux_c$ tree
.
├── lib
├── main.c
└── src
    ├── add.c
    └── div.c

2016-08-01_14:06:13 chunli@http://990487026.blog.51cto.com~/linux_c$ cat src/add.c 
int add(int a,int b)
{
	return a+b;
}

2016-08-01_14:06:22 chunli@http://990487026.blog.51cto.com~/linux_c$ cat src/div.c 
int div(int a,int b)
{
	if(b == 0)
	{
		return -1;
	}
	return a/b;
}

2016-08-01_14:06:25 chunli@http://990487026.blog.51cto.com~/linux_c$ cat main.c 
#include <stdio.h>

int main(void)
{
	printf("%d\n",add(2,4));
	printf("%d\n",div(8,3));
	return 0;
}

編譯與位置不相關
2016-08-01_14:34:11chunli@http://990487026.blog.51cto.com~/linux_c$ cd src/
2016-08-01_14:35:17chunli@http://990487026.blog.51cto.com~/linux_c/src$ gcc -c -fPIC *.c
2016-08-01_14:35:41chunli@http://990487026.blog.51cto.com~/linux_c/src$ ls
add.c  add.o  div.c  div.o

搞一個共享庫
2016-08-01_14:38:47chunli@http://990487026.blog.51cto.com~/linux_c/src$ gcc -shared -Wl,-soname,libmycal.so.1 -o libmycal.so.1.10 *.o
2016-08-01_14:38:49chunli@http://990487026.blog.51cto.com~/linux_c/src$ ls
add.c  add.o  div.c  div.o  libmycal.so.1.10

2016-08-01_14:38:50chunli@http://990487026.blog.51cto.com~/linux_c/src$ mv libmycal.so.1.10 ../lib/
2016-08-01_14:40:39chunli@http://990487026.blog.51cto.com~/linux_c/src$ cd ..
2016-08-01_14:40:44chunli@http://990487026.blog.51cto.com~/linux_c$ tree
.
├── lib
│   └── libmycal.so.1.10
├── main.c
└── src
    ├── add.c
    ├── add.o
    ├── div.c
    └── div.o

編譯通過,運行報錯
2016-08-01_14:43:21chunli@http://990487026.blog.51cto.com~/linux_c$ gcc -o app main.c lib/libmycal.so.1.10 
2016-08-01_14:43:33chunli@http://990487026.blog.51cto.com~/linux_c$ ls
app  lib  main.c  src
2016-08-01_14:43:35chunli@http://990487026.blog.51cto.com~/linux_c$ ./app 
./app: error while loading shared libraries: libmycal.so.1: cannot open shared object file: No such file or directory
2016-08-01_14:43:38chunli@http://990487026.blog.51cto.com~/linux_c$ 

查看依賴:libmycal.so.1 => not found
2016-08-01_14:43:38chunli@http://990487026.blog.51cto.com~/linux_c$ ldd ./app 
	linux-vdso.so.1 =>  (0x00007fffba765000)
	libmycal.so.1 => not found
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f19daf92000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f19db357000)

解決方案:把庫的路徑搞到/etc/ld.so.conf裡面
2016-08-01_14:46:59chunli@http://990487026.blog.51cto.com~/linux_c$ cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf
/home/chunli/linux_c/lib

更新:根據realname自動生成soname
2016-08-01_14:47:59chunli@http://990487026.blog.51cto.com~/linux_c$ sudo ldconfig -v
看看變化:
2016-08-01_14:48:15chunli@http://990487026.blog.51cto.com~/linux_c$ tree
.
├── app
├── lib
│   ├── libmycal.so.1 -> libmycal.so.1.10
│   └── libmycal.so.1.10
├── main.c
└── src
    ├── add.c
    ├── add.o
    ├── div.c
    └── div.o

如果更新失敗,重新更新
刪除/etc/ld.so.cache 

再查一下,找到了吧   
2016-08-01_14:48:55chunli@http://990487026.blog.51cto.com~/linux_c$ ldd ./app 
	linux-vdso.so.1 =>  (0x00007ffccd709000)
	libmycal.so.1 => /home/chunli/linux_c/lib/libmycal.so.1 (0x00007ff302499000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff3020d4000)
	/lib64/ld-linux-x86-64.so.2 (0x00007ff30269b000)

運行:OK
2016-08-01_14:48:56chunli@http://990487026.blog.51cto.com~/linux_c$ ./app 
6
2

手動生成linkname
2016-08-01_14:55:44chunli@http://990487026.blog.51cto.com~/linux_c/lib$ tree
.
├── libmycal.so -> libmycal.so.1.10
├── libmycal.so.1 -> libmycal.so.1.10
└── libmycal.so.1.10

本文出自 “魂斗羅” 博客,謝絕轉載!
Copyright © Linux教程網 All Rights Reserved