day03

来源:互联网 发布:mac上哪里下游戏 编辑:程序博客网 时间:2024/06/10 20:58
回忆昨天的内容:
一、C语言的指针
二、使用typedef定义类型的别名

今天的内容:
一、环境变量
shell是用于用户和操作系统对话的一个窗口。一款软件。
用户使用shell和操作系统对话的时候,需要存储一些信息,这些信息被存储到变量(shell认知的变量)中。变量分为两类。自定义变量、环境变量
自定义变量只能在自己中使用。而环境变量可以被子进程继承。

如何察看环境变量?
env

环境变量的格式
环境变量的名字=环境变量的值
USER=tarena
在bash中如何察看环境变量的值
echo $环境变量的名字
echo "$环境变量的名字"

echo '$环境变量的名字'

如何添加一个自定义变量并为其设初值?
name=tarena
将用户自定变量转换为环境变量
export 环境变量的名字
export name

可以将上边两个步骤合二为一。
export name=pycoming

PATH环境变量
tarena@tarena-G41MT-S2PT:~$ echo $PATH

/home/tarena/workdir/Android2.3/android-source/jdk1.6.0_16/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/home/tarena/workdir/linux-x86/sdk/android-sdk_eng.root_linux-x86/tools

.  当前路径
如何将当前路径添加到PATH环境变量的后边
 export PATH=$PATH:.

/home/tarena/workdir/Android2.3/android-source/jdk1.6.0_16/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/home/tarena/workdir/linux-x86/sdk/android-sdk_eng.root_linux-x86/tools:.

bash在启动的时候,需要先运行一个文件,然后在启动bash。
这个文件成为bash的启动配置文件  ~/.bashrc
~  当前用户的家目录

PS1环境变量
用于设置bash的提示符。   
《鸟哥私房菜》
export PS1="\W\$"

二、静态库的制作和使用
静态库文件的命名   lib+库名.a

如何制作和使用静态库文件?(举例说明,使用tmath文件夹)
1、将需要加到静态库里的源文件编译为目标文件
tmath$gcc -c *.c
tmath$ls
add.c  add.o  mul.c  mul.o  tmath.h
tmath$

2、将目标文件添加到静态库里。
tmath$ar -r libtmath.a *.o
ar: creating libtmath.a
tmath$ls
add.c  add.o  libtmath.a  mul.c  mul.o  tmath.h

3、使用静态库文件链接目标文件形成可执行文件
gcc test.o -Ltmath -ltmath

-L路径   路径可以是绝对路径也可以是相对路径,指定链接器的搜索路径
-l库名   静态库或动态库的库名。

三、动态库的制作和使用
动态库的命名   lib+库名.so
1、将需要添加到动态库里的源文件编译为与位置无关的目标文件
tmath$gcc -c -fPIC *.c
tmath$ls
add.c  add.o  mul.c  mul.o  tmath.h

2、将目标文件添加到动态库中。
tmath$gcc -shared -o libtmath.so *.o
tmath$ls
add.c  add.o  libtmath.so  mul.c  mul.o  tmath.h
3、使用动态库链接目标文件,生成可执行文件。
day03$pwd
/home/tarena/CSD1702/uc/day03
day03$gcc test.c -Ltmath -ltmath -o tt
test.c: 在函数‘main’中:
test.c:24: 错误: 只允许在 C99 模式下使用‘for’循环初始化声明
test.c:24: 附注: 使用 -std=c99 或 -std=gnu99 来编译您的代码
day03$gcc test.c -Ltmath -ltmath -o tt -std=c99
day03$ls
a.out  hello.c  test.o  tt    笔记~
hello  test.c   tmath   笔记
day03$tt
tt: error while loading shared libraries: libtmath.so: cannot open shared object file: No such file or directory

出错了.????
出错的原因是加载器在指定的路径下找不到tt程序依赖的动态库文件。

使用ldd命令察看可执行文件依赖的动态库文件

day03$ldd tt
    linux-gate.so.1 =>  (0xb7751000)
    libtmath.so => not found
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7596000)
    /lib/ld-linux.so.2 (0xb7752000)

day03$nm tt
08049f20 d _DYNAMIC
08049ff4 d _GLOBAL_OFFSET_TABLE_
0804876c R _IO_stdin_used
         w _Jv_RegisterClasses
08049f10 d __CTOR_END__
08049f0c d __CTOR_LIST__
08049f18 D __DTOR_END__
08049f14 d __DTOR_LIST__
08048858 r __FRAME_END__
08049f1c d __JCR_END__
08049f1c d __JCR_LIST__
0804a024 A __bss_start
0804a01c D __data_start
08048720 t __do_global_ctors_aux
080484f0 t __do_global_dtors_aux
0804a020 D __dso_handle
         w __gmon_start__
08048712 T __i686.get_pc_thunk.bx
08049f0c d __init_array_end
08049f0c d __init_array_start
08048710 T __libc_csu_fini
080486a0 T __libc_csu_init
         U __libc_start_main@@GLIBC_2.0
0804a024 A _edata
0804a02c A _end
0804874c T _fini
08048768 R _fp_hw
08048410 T _init
080484c0 T _start
0804a024 b completed.7108
0804a01c W data_start
0804a028 b dtor_idx.7110
08048550 t frame_dummy
0804858e T main
         U printf@@GLIBC_2.0
08048574 T process
         U t_add
         U t_div
         U t_mul
     U t_sub
告诉加载器,动态库文件的路径。
两种方式:
使用环境变量LD_LIBRARY_PATH指定加载器的寻找路径。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./tmath/   



四、动态加载库函数
五、程序中的错误处理。
原创粉丝点击