一、GDB调试工具的使用
举例演示GDB调试工具的使用
代码参见tmaht文件夹
在程序编译链接成可执行文件的时候,加上-g/-ggdb参数
gcc -g *.c -std=c99
这样生成的可执行文件里含有调试信息
使用以下命令启用GDB调试工具来调试可执行程序
gdb a.out
GDB调试命令
l list 列出文件的内容
b 行号/函数的名字 breakpoint 设置断点
r run运行
n next 下一条语句
p 变量的名字 察看每个变量的值
s step 下一步
q quit 退出
补充:
什么是断点?
程序执行到这个点的时候,停止在这里。
二、环境变量
环境变量是bash进程给子进程提供的运行环境。
什么是进程?
程序运行起来就是进程。
程序运行的实例,就是进程。
进程是动态的
什么是程序?
程序是计算机指令的集合。是以文件的形式存放在计算机的磁盘里。
程序是静态的
怎么去察看环境变量?
env命令察看bash提供的环境变量
格式:
环境变量名=值
提取环境变量的值
$环境变量名
为环境变量赋值
环境变量名=值
将自定义变量转换为环境变量
export 变量名
环境变量PATH
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的应用
编写hello.c程序,编译生成hello。将hello更名为ls。将自己的ls程序放到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
export PATH=$PATH:.
~ 用户工作主目录
环境变量PS1
export PS1="\W\$"
提示符
更多的提示符的符号参见《鸟哥私房菜》
三、静态库的制作和使用
使用的代码参见tmath文件夹
#include <> 和 #include ""的区别
gcc -v hello.c
静态库的制作和使用
静态库的命名 lib+库名.a
gcc -c *.c
ar -r libtmath.a *.o
gcc ../test.c -L. -ltmath -std=c99 -o t
-L路径 这个路径是库文件所在文件夹的路径
-l函数库名字 指定仓库的名字
四、动态库的制作和使用
动态库的命名 lib+库名.so
第一步:
gcc -fPIC -c *.c
-fPIC 与位置无关参数
第二步:
gcc -shared -o libtmath.so *.o
第三步:
gcc test.c -Ltmath -ltmath -std=c99
day03$a.out
a.out: error while loading shared libraries: libtmath.so: cannot open shared object file: No such file or directory
怎么察看a.out文件依赖于哪些动态库?
ldd a.out
day03$ldd a.out
linux-gate.so.1 => (0xb7709000)
libtmath.so => not found
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb754e000)
/lib/ld-linux.so.2 (0xb770a000)
加载器找不到libtmath.so。
怎么让加载器能找到libtmath.so?
加载器查找动态库的两种方式
1. LD_LIBRARY_PATH
2.将库文件移动到 /usr/lib 或者 /lib文件夹下。
连接器默认的搜索路径
同时也是加载器的默认路径
将libtmath.so 移动到/usr/lib
静态链接:在编译的时候,发生的链接,称为静态链接
动态链接:代码加载到内存运行的时候,发生的链接,称为动态链接
静态库和动态库的区别:
使用静态库编译链接的程序,在可执行文件中使用到的静态库的函数被拷贝到了可执行文件里。可执行文件不再依赖与静态库了。静态链接的可执行文件比较大。
使用动态库编译链接的程序,在可执行文件里使用到的动态库里的函数,只是做了一个符号的简单的引用,并没有发生代码的拷贝,在可执行程序执行的时候,还依赖于动态库的文件。
使用动态库链接的可执行文件比较小。会产生库文件的共享。
-fPIC 适用于通用的架构
-fpic 适用于几个架构
补充:
小结:
一、GDB调试工具的使用
二、环境变量
三、静态库的制作和使用
四、动态库的制作和使用
动态链接 静态链接
动态库和静态库的区别
举例演示GDB调试工具的使用
代码参见tmaht文件夹
在程序编译链接成可执行文件的时候,加上-g/-ggdb参数
gcc -g *.c -std=c99
这样生成的可执行文件里含有调试信息
使用以下命令启用GDB调试工具来调试可执行程序
gdb a.out
GDB调试命令
l list 列出文件的内容
b 行号/函数的名字 breakpoint 设置断点
r run运行
n next 下一条语句
p 变量的名字 察看每个变量的值
s step 下一步
q quit 退出
补充:
什么是断点?
程序执行到这个点的时候,停止在这里。
二、环境变量
环境变量是bash进程给子进程提供的运行环境。
什么是进程?
程序运行起来就是进程。
程序运行的实例,就是进程。
进程是动态的
什么是程序?
程序是计算机指令的集合。是以文件的形式存放在计算机的磁盘里。
程序是静态的
怎么去察看环境变量?
env命令察看bash提供的环境变量
格式:
环境变量名=值
提取环境变量的值
$环境变量名
为环境变量赋值
环境变量名=值
将自定义变量转换为环境变量
export 变量名
环境变量PATH
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的应用
编写hello.c程序,编译生成hello。将hello更名为ls。将自己的ls程序放到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
export PATH=$PATH:.
~ 用户工作主目录
环境变量PS1
export PS1="\W\$"
提示符
更多的提示符的符号参见《鸟哥私房菜》
三、静态库的制作和使用
使用的代码参见tmath文件夹
#include <> 和 #include ""的区别
gcc -v hello.c
静态库的制作和使用
静态库的命名 lib+库名.a
gcc -c *.c
ar -r libtmath.a *.o
gcc ../test.c -L. -ltmath -std=c99 -o t
-L路径 这个路径是库文件所在文件夹的路径
-l函数库名字 指定仓库的名字
四、动态库的制作和使用
动态库的命名 lib+库名.so
第一步:
gcc -fPIC -c *.c
-fPIC 与位置无关参数
第二步:
gcc -shared -o libtmath.so *.o
第三步:
gcc test.c -Ltmath -ltmath -std=c99
day03$a.out
a.out: error while loading shared libraries: libtmath.so: cannot open shared object file: No such file or directory
怎么察看a.out文件依赖于哪些动态库?
ldd a.out
day03$ldd a.out
linux-gate.so.1 => (0xb7709000)
libtmath.so => not found
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb754e000)
/lib/ld-linux.so.2 (0xb770a000)
加载器找不到libtmath.so。
怎么让加载器能找到libtmath.so?
加载器查找动态库的两种方式
1. LD_LIBRARY_PATH
2.将库文件移动到 /usr/lib 或者 /lib文件夹下。
连接器默认的搜索路径
同时也是加载器的默认路径
将libtmath.so 移动到/usr/lib
静态链接:在编译的时候,发生的链接,称为静态链接
动态链接:代码加载到内存运行的时候,发生的链接,称为动态链接
静态库和动态库的区别:
使用静态库编译链接的程序,在可执行文件中使用到的静态库的函数被拷贝到了可执行文件里。可执行文件不再依赖与静态库了。静态链接的可执行文件比较大。
使用动态库编译链接的程序,在可执行文件里使用到的动态库里的函数,只是做了一个符号的简单的引用,并没有发生代码的拷贝,在可执行程序执行的时候,还依赖于动态库的文件。
使用动态库链接的可执行文件比较小。会产生库文件的共享。
-fPIC 适用于通用的架构
-fpic 适用于几个架构
补充:
小结:
一、GDB调试工具的使用
二、环境变量
三、静态库的制作和使用
四、动态库的制作和使用
动态链接 静态链接
动态库和静态库的区别