Makefile文件以及静态库和动态库

在Linux下写项目总会碰见这样的情况------哎呀~~这个项目的文件需要好多文件一起编译,这么多,眼睛快花了。我去!少编译一个,又要重新打了,心态炸了。。。。       //(T o T)//

makefile文件目的是为了方便工程管理,当面临你写了很多个源文件的时候这个时候为了简化你的大量重复编译而设计出来的途家, 再者很多项目就编译就要很长时间,改3次代码编译三次一天就过去了,啥也没干。而一个make 命令,改代码再编译时,它会根据源文件的最后修改时间来判断此文件需不需要重新编译,大大提高工作效率.

不多说上图

编译完上述文件后我们只要输入make命令,我们就能得到编译的各个文件,然后输入make clean 就可以删除编译的中间文件。

make命令会默认在此目录找  makefile/Makefile 文件,如果我们写的 makefile文件名字叫做main,要运行只需要加个参数就行,例如:

  make -f main      这样时是等价的.

在下面说一说makefile文件的简化以及一些补充:

    库文件分为 静态库 是和 动态库(共享库):

  1)静态库(Linux上为 .a     Window上为 .lib  )

                 1.是中间文件的集合,在链接阶段直接将库中的内容合并到最终的可执行文件中,就是说,链接完成后,生成的可执行文                           件的执行不再依赖静态库

                  2.静态库生成的命令:           gcc   -c   *.c  (先将.c文件生成对应的.o文件)

                                                              ar  crv  libxxxx.a   *.o          (其中xxxx是生成的库名,前面的 lib和后面的 .a必须有 ) 

                  3.静态库的使用:

                                     第一种:          gcc  -o  run   main.c   -L(库路径)  -l(库名)

                                              例如:     gcc   -o  run  main.c   -L/home/stu/lib   -lList

                                     第二种:          gcc  -o  run   main.c   路径/libxxxx.a

                                               例如:    gcc  -o  run   main.c   /home/stu/lib/libList.a

 

   2)动态库(Linux上为 .so     Window上为 .dll  )

                   1.动态库是 不可单独执行的可执行文件,链接阶段只在可执行文件中设置使用的的库,运行时由操作系统加载到内存上                       执行,因此生成的可执行文件在执行时要依赖动态库的存在

                   2.动态库生成的命令:

                                    gcc  -shared  -fPIC  -o  libxxxx.so    *.c

                   3.动态库的使用: 同静态库一样

                   4.当链接完成后执行时会有问题,问题出现的原因是: 动态库需要由操作系统加载到内存上,但我们自己写的库操作系统                       找不到,因此依赖动态库而的程序不能直接运行,会出错!  解决这个问题有以下两种方案:

                            <1>将动态库拷贝到 /lib 或 /usr/lib 目录下,但是这个操作需要 root 权限,不建议这么做

                            <2>设置环境变量        export   LD_LIBRARY_PATH=动态库所在的绝对路径

                                             vi   /home/.bashrc        //进入到.bashrc这个配置文件中

                                             然后在文件的最后加上一句    export   LD_LIBRARY_PATH=动态库所在的绝对路径

                   5.       ldd     run    //查看可执行文件run中所加载的动态库


动态库和静态库的区别


                  1.同样的程序,使用静态库比使用共享库程序更大
                  2. 静态库在编译链接是,就加入到了可执行程序中,共享库是在运行程序后动态装载
                  3.目标主机没有静态库,程序可以运行,没有共享库,运行不了
                  4.共享库升级后,程序不需要重新编译吗可以直接被使用,静态库需要重新编写程序,链接新方法

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值