gcc的相关流程以及linux下的动静态库的使用

一、gcc的工程流程

1、预处理:包括头文件的展开、宏定义替换、注释去除
2、汇编:把C文件变成汇编文件
3、编译:把汇编文件变成二进制文件
4、链接:把各种xxx.o的二进制文件,组合在一起生成可执行文件

二、gcc的常用参数

  • -I::编译的时候指定头文件路径
  • -c:将汇编文件生成二进制文件,得到了一个.o文件
  • -o: 指定生成的文件的名字
  • -g:需要gdb调试的时候需要加上
  • -D:在编译的时候指定一个宏
  • -Wall:添加警告信息
  • -On:优化代码, n是优化级别: 1、2、3
     

三、动静态库的制作和使用

静态库:
静态库的命名规则:libxxx .a
将各个.c文件生成.o文件:gcc *.c -c
将各个.o进行 打包:ar rcs 静态库的名字。例如:ar rcs libtest.a *.o
静态库的使用(去掉头尾):gcc test.c -I ./ -L./lib -lmycalc -o app,-L: 指定库的路径而-l:指定库的名字

PS:查看静态库信息的命令:nm + 静态库名称

动态库:
动态库的命名规则:libxxx .so
将各个.c文件生成.o文件:gcc a.c b.c -c -fpic
将各个.o进行 打包:gcc -shared  *.o -o libxxx.so
动态库的使用(去掉头尾):gcc test.c -I ./ -L./lib -lmycalc -o app,-L: 指定库的路径而-l:指定库的名字

PS:查看可执行文件所依赖的动态库的命令:ldd + 可执行文件;
        用man man查看帮助文档章节,用man + x + 具体函数查看函数的具体说明;
        写程序时可以用x + 大写的K,查看某一行的函数说明 

解决动态库无法加载的问题:

1、使用环境变量
(1)  如果是临时设置的话,在终端敲入:export LD_LIBRARY_PATH = 动态库的路径:$LD_LIBRARY_PATH;
(2)  如果是永久设置的话,用户级别下在家目录~/.bashrc的.bashrc文件中添加export LD_LIBRARY_PATH = 动态库路径::$LD_LIBRARY_PATH,需要配置完成要在终端敲入:source ~/.bashrc命令;系统级别下/etc/profile文件中添加export LD_LIBRARY_PATH = 动态库路径::$LD_LIBRARY_PATH,需要配置完成要在终端敲入:source /etc/profile 命令

2、使用/etc/ld.so.cache文件列表
找到一个配置文件/etc/ld.so.conf,然后把动态库的绝对路径添加到文件中,配置完成需要在终端敲入:sudo ldconfig -v 命令

四、动静态库的优缺点

静态库:
(1) 优点:静态库被打包到应用程序中加载速度快,发布程序无需提供静态库,移植方便
(2) 缺点:浪费系统资源,浪费内存,更新、部署、发布麻烦;静态库在内存中存在多分拷贝导致空间浪费

动态库:
1、优点:(1) 可实现进程间资源共享,程序升级简单,程序猿可以控制何时加载动态库;
                (2) 动态库在内存中只存在一份拷贝,避免了静态库浪费空间的问题
2、缺点:加载速度比静态库慢,发布程序需要提供依赖的动态库;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值