linux系统开发 1 基础apt-get 进程 作业 环境变量 安装vsftpd VIM GCC

本文谢绝转载,原文来自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:[email protected]://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/

踢人下线

[email protected]://990487026.blog.51cto.com~$ ps
   PID TTY          TIME CMD
  3585 pts/0    00:00:00 bash
  3899 pts/0    00:00:00 ps
[email protected]://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)
[email protected]://990487026.blog.51cto.com~$

列出所有进程:

[email protected]://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;

[email protected]://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
[email protected]://990487026.blog.51cto.com~$

环境变量:

[email protected]://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
[email protected]://990487026.blog.51cto.com~$

添加用户:

[email protected]://990487026.blog.51cto.com~$ sudo useradd -s /bin/bash -g chunli -d /home/xioaming -m xiaoming

finger 用户信息

[email protected]://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.
[email protected]://990487026.blog.51cto.com~$

安装vsftpd:

ubuntu14.04

[email protected]:~$ sudo apt-get install vsftpd
[email protected]:~$ echo $?

[email protected]:~$ sudo mkdir /home/ftp
[email protected]:~$ sudo chmod 777 /home/ftp/

[email protected]:~$ 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

[email protected]:~$ sudo service vsftpd restart
[email protected]:~$ netstat -tnlp
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN      -               

登陆:[email protected]:~$ 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版本

[email protected]:~$ gcc -v
gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3) 
[email protected]:~$ 
有些项目的开发需要指定版本的编译器

gcc -I指定头文件的位置:

[email protected]:~$ gcc -I/tmp/  main.c 
[email protected]:~$ cat main.c 
#include <stdio.h>
#include "test.h"

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

gcc -DDEBUG 定义宏参数

[email protected]:~$ cat main.c 
#include <stdio.h>
int main(void)
{
	#ifdef DEBUG
		printf("hello \n");
	#endif

	return 0;
}

[email protected]:~$ gcc -DDEBUG main.c 
[email protected]:~$ ./a.out 
hello 
[email protected]:~$

-E参数:预编译

[email protected]:~$ gcc -DDEBUG  -E main.c -o main.i
[email protected]:~$ cat main.i

nm 查看符号表

[email protected]:~$ 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 [email protected]@GLIBC_2.2.5
000000000040052d T main
                 U [email protected]@GLIBC_2.2.5
00000000004004a0 t register_tm_clones
0000000000400440 T _start
0000000000601040 D __TMC_END__
[email protected]:~$

objdump反汇编

[email protected]:~$ 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 查看程序依赖哪些库

[email protected]:~$ cat main.c 
#include <stdio.h>
int main(void)
{
	printf("hello \n");
	return 0;
}

[email protected]:~$ gcc  main.c && ./a.out 
hello 
[email protected]:~$ 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)
[email protected]:~$

共享库简介:

[email protected]:~$ cat add.c 
int add(int a,int b)
{
	return a+b;
}

[email protected]:~$ gcc -fPIC -c add.c 
[email protected]:~$ 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文件
[email protected]:~$ gcc -shared -Wl,-soname,libmyadd.so.1 -o libmyadd.so.1.10 add.o 
[email protected]:~$ 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*

写个主函数,来调用
[email protected]:~$ cat main.c 
#include <stdio.h>

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

[email protected]:~$ gcc  main.c libmyadd.so.1.10
运行时出错 
[email protected]:~$ ./a.out 
./a.out: error while loading shared libraries: libmyadd.so.1: cannot open shared object file: No such file or directory
[email protected]:~$ 

查看程序的依赖:可以看到not found
[email protected]:~$ 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)
[email protected]:~$ 

【问题解决】修改ld.so.conf
追加一行动态库的路径
libmyadd.so.1.10 在 /home/chunli目录下
[email protected]:~$ cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf
/home/chunli

更新 ldconfig -v
[email protected]:~$ sudo ldconfig -v
生成了soname,指向realname
[email protected]:~$ 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*

再次执行
[email protected]:~$ ./a.out 
6

linkname的制作,都指向realname 
[email protected]:~$ ln -s libmyadd.so.1.10 libadd.so
[email protected]:~$ 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 [email protected]://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 [email protected]://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 [email protected]://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 [email protected]://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 [email protected]://990487026.blog.51cto.com~/linux_c$ cd src/
2016-08-01_14:07:33 [email protected]://990487026.blog.51cto.com~/linux_c/src$ gcc -c -fPIC *.c
2016-08-01_14:07:47 [email protected]://990487026.blog.51cto.com~/linux_c/src$ ls
add.c  add.o  div.c  div.o

做一个静态库:
2016-08-01_14:07:50 [email protected]://990487026.blog.51cto.com~/linux_c/src$ ar rcs libmycal.a *.o
2016-08-01_14:11:03 [email protected]://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 [email protected]://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:[email protected]://990487026.blog.51cto.com~/linux_c/src$ cd ..
2016-08-01_14:14:40 [email protected]://990487026.blog.51cto.com~/linux_c$ mv src/libmycal.a  lib/
2016-08-01_14:15:23 [email protected]://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 [email protected]://990487026.blog.51cto.com~/linux_c$ gcc main.c  lib/libmycal.a 
2016-08-01_14:15:52 [email protected]://990487026.blog.51cto.com~/linux_c$ ./a.out 
6
2

2016-08-01_14:21:[email protected]://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:[email protected]://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:[email protected]://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:[email protected]://990487026.blog.51cto.com~/linux_c$ tree
.
├── lib
├── main.c
└── src
    ├── add.c
    └── div.c

2016-08-01_14:06:13 [email protected]://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 [email protected]://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 [email protected]://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:[email protected]://990487026.blog.51cto.com~/linux_c$ cd src/
2016-08-01_14:35:[email protected]://990487026.blog.51cto.com~/linux_c/src$ gcc -c -fPIC *.c
2016-08-01_14:35:[email protected]://990487026.blog.51cto.com~/linux_c/src$ ls
add.c  add.o  div.c  div.o

搞一个共享库
2016-08-01_14:38:[email protected]://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:[email protected]://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:[email protected]://990487026.blog.51cto.com~/linux_c/src$ mv libmycal.so.1.10 ../lib/
2016-08-01_14:40:[email protected]://990487026.blog.51cto.com~/linux_c/src$ cd ..
2016-08-01_14:40:[email protected]://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:[email protected]://990487026.blog.51cto.com~/linux_c$ gcc -o app main.c lib/libmycal.so.1.10 
2016-08-01_14:43:[email protected]://990487026.blog.51cto.com~/linux_c$ ls
app  lib  main.c  src
2016-08-01_14:43:[email protected]://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:[email protected]://990487026.blog.51cto.com~/linux_c$ 

查看依赖:libmycal.so.1 => not found
2016-08-01_14:43:[email protected]://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:[email protected]://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:[email protected]://990487026.blog.51cto.com~/linux_c$ sudo ldconfig -v
看看变化:
2016-08-01_14:48:[email protected]://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:[email protected]://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:[email protected]://990487026.blog.51cto.com~/linux_c$ ./app 
6
2

手动生成linkname
2016-08-01_14:55:[email protected]://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
时间: 2024-10-05 05:59:52

linux系统开发 1 基础apt-get 进程 作业 环境变量 安装vsftpd VIM GCC的相关文章

Linux系统误修改/etc/profile;如何恢复环境变量

上午在公司的一台NGINX前端服务器上进行维护操作:想把nginx的命令path"/usr/local/nginx/sbin/"给加到/etc/profile上:编辑完毕:source /etc/profile:紧接着发现ls.vi等最常见的命令都没法使用:一开始把我吓坏了,此时才醒悟过来,是把原先的PATH变量值给覆盖了:面对这种情况最好的方法:就是执行echo"export PATH=/bin >> /etc/profile"先保证系统能使用最基本的

Linux系统开发7 进程关系,守护进程

[本文谢绝转载原文来自http://990487026.blog.51cto.com] <大纲> Linux系统开发7  进程关系守护进程 终端 网络终端 Linux PCB结构体信息 进程组 修改子进程.父进程的组ID 会话组 设置一个会话脱离控制终端 生成一个新的会话 守护进程 守护进程模板 获取当前系统时间  终端 在UNIX系统中用户通过终端登录系统后得到一个Shell进程这个终端成为Shell进 程的控制终端Controlling Terminal在讲进程时讲过控制终端是保存在PCB

Linux系统开发 4 进程资源 环境 fork()子进程 wait() waitpid()僵尸 孤儿进程

<大纲> Linux系统编程 进程资源上限 进程环境变量 进程获取/修改环境变量 创建子进程fork() 最大进程数测试 程序的设置用户ID/组ID/黏住位 exec簇函数,执行程序覆盖堆栈 fork 与execl函数在一起 exec() 与主程序同一个PCB 僵尸进程 wait()回收僵尸进程 证明:父子进程同组pid waitpid() 非阻塞等待子线程发生变化 孤儿进程演示[父进程已经结束,子进程还在运行] 进程资源上限值 [email protected]:~$ cat /proc/s

61 &nbsp; Linux系统调优基础

01 Linux系统调优基础 #显示进行在哪个cpu上运行 [[email protected] ~]# ps axo psr,     2 ntpd   1 qpidd   3 pickup   3 sshd   0 bash   2 pscomm     #显示进行在哪个cpu上运行,并显示进程的pid  [[email protected] ~]# ps axo psr,comm,pid   2 ntpd             3775   1 qpidd            9998

Linux系统开发6 信号

[本文谢绝转载,原文来自http://990487026.blog.51cto.com] <大纲> Linux系统开发6 信号 linux系统有64种信号 signal man文档 终端按键信号 ctrl +c SIGIN ctrl +z SIGTSTP ctrl +\ SIGQUIT 硬件产生信号 浮点数例外信号  访问非法内存 kill()函数 信号与权限 kill()函数的pid 与返回值 信号产生原因 raise() 信号 abort() 信号 alarm() 信号 收到信号的默认操作

Linux 系统开发5 进程间通信 pipe() fifo() mmap()

[本文谢绝转载,原文来自http://990487026.blog.51cto.com] Linux 系统开发5 进程间通信 pipe() fifo() mmap() pipe()管道通信介绍 pipe()父子进程通信案例 pipe()使用管道有一些限制 pipe()管道缓存区大小 pipe() 读端非阻塞管道 fifo()管道文件 fifo()写端/读端程序 管道文件在磁盘上的大小是0 mmap()将文件映射到内存 mmap()写端/读端程序 mmap()传输结构体数据,删除临时文件 pipe

Linux系统开发 2 文件IO open() close() read() write() perror() lseek() fcntl() ioctl()

[本文谢绝转载,原文来自http://990487026.blog.51cto.com] 大纲 Linux系统开发 man 文档的使用 文件IO open() 创建文件,指定权限位 open() 接收参数 创建文件 open() 传两个参数 第三个参数从内存取垃圾值 write()函数 向文件写数据 write()函数的覆盖操作 open()函数文件的追加 open() 创建文件,如果文件已经存在,就报错 测试一个程序最多能创建1021个文件,3个STDIN STDOUT STDERR已经存在了

Linux系统开发 3 文件系统开发 文件/目录

[本文谢绝转载,原文来自http://990487026.blog.51cto.com] Linux系统开发 文件操作 ext2文件系统了解 stat()函数 access()函数 chmod()函数 utime()函数 truncate()函数 link()硬链接函数 symlink()软链接函数 readlink()函数 unlink函数 rename函数() 目录操作 chdir()/fchdir() getcwd/getwd()/get_current_dir_name() pathco

Linux系统开发8 线程

[本文谢绝转载原文来自http://990487026.blog.51cto.com] <大纲> Linux系统开发8 线程 线程概念 浏览器 火狐多线程,谷歌多进程比较: 查看某一个进程有哪些线程 线程间共享资源 线程间非共享资源 线程优缺点 安装完整的manpage文档 pthread_create()创建线程 pthread_self() 获取线程自己的ID 线程创建程序演示: 指定libpthread.so库编译链接 演示:进程结束,线程也会立即结束 pthread_exit() 调用