Linux的知识整理2

静态库和动态库的创建:
静态库创建的步骤:
1、编辑要生成的库文件:vim add.c(在这个里面实现a + b的功能)
2、将库文件编译成中间代码:gcc -c add.c(生成.o文件)
3、将中间代码生成静态库:ar rcs libadd.a add.o===》libadd.a的意思:lib是前缀,add是我要生成的静态库的名字,a表明要
                                                   生成的是静态库;
备注:经过以上三步,已经创建好了静态库,接下来是调用静态库;
4、编辑调用库函数的源程序:vim demo.c
5、将源文件编译成可执行文件:gcc demo.c -ladd -L.(这块命令要注意libadd.a在什么目录下面,libadd.a在不同的目录下面就不是-L.了)                                                   

动态库的创建步骤:
1、编辑要生成的库文件:vim add.c(在这个里面实现a + b的功能)
2、将库文件编译成中间代码:gcc -c add.c -fpic
3、将中间代码生成动态库:gcc add.o -o libadd.so -shared
备注:经过以上三步,已经创建好了动态库,接下来是调用静态库;
4、编辑调用库函数的源程序:vim demo.c
5、将源文件编译成可执行文件:gcc demo.c ./libadd.so(注意目录)

小结:上述创建静态库和动态库以及它们的使用,步骤和思路是一样的,只不过命令不一样;

动态库和静态库的区别:
1、静态库用.a作为后缀,动态库用.so作为后缀;
2、当使用静态库的时候,链接器找出程序中所需要的库函数,然后将它们拷贝到可执行文件里面,调用一次拷贝一次,一旦链接成功,静态库就不需要了,因为可执行文件里面已经包含了库函数!
   ====》对应上课时演示现象:当你把libadd.a切换(mv)到其他目录下面的时候,a.out还是可以执行的;
   使用动态库,在可执行程序里面留下一个标记,指明当前的可执行文件执行时,首先必须载入这个库,是在运行的时候调用的;
   ====》对应上课时演示现象:当你把libadd.so 切换到其他目录下面的时候,a.out可执行文件就无法运行了;
3、链接动态库生成的可执行文件要比链接静态库生成的可执行文件要小;
4、在Linux如果缺少-static参数的时候,默认链接的是动态库;


gdb调试工具:
1、基于什么样的现实需求:
2、编译时加的参数:gcc -g demo
3、进入到gdb环境下:gdb ./a.out(这里是可执行文件名,根据实际情况写上)
4、退出gdb环境:quit
5、gdb里面的调试命令:
   运行程序:run
   打断点:break 函数的名字  或者 break 行号
   查看当前打了哪些断点:info break
   删除断点:delete 断点号
   继续往下执行程序:
        continue===》停止在下一个断点的地方,如果下面没有断点的话,一直执行结束;
        step:单步执行程序,也就是一行一行地执行程序;(遇到函数的时候,会进入到函数的内部去执行);
        next:单步执行程序,也就是一行一行地执行程序;(遇到函数的时候,不会进入到函数的内部去执行);
        设置显示多少行:set listsize 数字
        查看当前显示多少行:show listsize
        打印变量的值:print 变量的名字
        打印变量的地址:print &变量名
        打印地址里面的值:print *地址
        可以设置当某个条件满足的时候断点生效:例子--》break 20 if i == 3

makefile工程管理器:
问题:
    什么是Makefile?为什么需要Makefile?没有Makefile行不行?有了Makefile之后可以带来什么好处?
基于这样的事实:
    实际的工程开发中,不可能把所有的代码都放在一个.c文件里面!否则会带来代码比较臃肿,功能划分的不明确,而且不利于程序员看代码!
    ====》根据类型,功能,模块,把代码放在不同的目录里面,而且不止一个.c文件!
    ====》如果在终端输入gcc A.c B.c C.c D.c ...的缺陷:
        1、容易出错;
        2、只是修改了某个.c文件,但是还要把其他没有修改的.c文件再通过命令编译一遍====》同样带来一些不必要的错误!

===》引入到Makefile工程管理器!
在Makefile文件里面我们会根据类型、功能、模块,指定编译的规则!指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译!

Makefile带来的好处:
1、减少不必要的编译错误;(少了个.c文件,多了个.c文件);
2、可以实现自动化编译:只需要在终端中输入一个make命令,就可以将所有的.c文件,根据Makefile文件指定的规则编译生成可执行文件;【时间戳】

怎么使用Makefile来实现自动化编译;
1、首先要有个makefile文件;
   需求:通过Makefile将add.c sub.c main.c只需要一个make命令就可以生成可执行文件,不需要输入gcc add.c sub.c main.c
   规则:
   目标文件:生成目标文件所需要的依赖文件(条件)
    <需要按一下tab键> 命令                            //将上面的"依赖文件"通过什么样的命令生成"目标文件"
    
    根据以下几个步骤来做:
    1、写好add.c sub.c main.c
    2、通过在命令行终端输入命令,看看能否生成可执行文件;
    3、在终端通过命令生成add.o sub.o main.o
    4、在第3步的基础上,写一个最简单的makefile文件(只需要两行)===》make编译一下,看看能否生成可执行文件;    
    5、在此之前,可以用*(通配符把所有的.o文件删掉),在第4步理解的基础上,不要在终端生成.o文件,直接在Makefile里面修改,看看能否生成可执行文件;        
2、在终端输入:make命令就可以生成可执行文件;(前提条件是:你的Makefile不能写错)

************************************************************************************************************

如有整理错误之处,可以留言指出

猜你喜欢

转载自blog.csdn.net/csdn_jking/article/details/81157395