GCC编译归纳总结

概述

一般在做项目的时候,都忽略了这个步骤,因为makefile是别人写好的,自己只要执行make操作就ok了,

但是真正的项目开发,需要程序员有这项基本技能。

弄明白gcc/g++编译器的基本参数和使用方法,在编译make出错后会有很大的帮助。

 

GCC使用心得

一个最为基本的工程,包含一个头文件.h和一个实现文件.c,还有一个测试文件test.cpp。

那么如何让这测试文件能顺利编译?

比如,现在在编写一个关于string类,那么会有String.h和String.c这2个文件,最后需要有一个测试文件test_string.cpp

那么如何编译这个测试文件呢?

 

小工具

1、查看Gcc默认查找的目录

gcc –print-search-dirs

Gcc编译器,会在搜索路径下,查找共享库,若存在,则链接它。

若不存在,则查找静态库,若只想链接静态库,可以指定-static选项

共享库:链接时只是指定了动态链接器和程序所需的库文件,没有做真的链接,在运行时做动态链接;

静态库:链接器把静态库中的目录文件取出来和可执行文件真正链接到一起

 

gcc –c xx.c

只编译或者汇编源文件,但是不链接

 

2、如何编译出共享库

gcc -c -g -fPIC stack/stack.c stack/push.cstack/pop.c stack/is_empty.c
gcc -shared -o libstack.so stack.o push.opop.o is_empty.o
gcc main.c -g -L. -lstack -Istack -o main


3、查看可执行文件依赖哪些库

Ldd /usr/lib64/librados.so.2.0.0.0
[root@lab205 ~]# ldd/usr/lib64/librados.so.2.0.0
       linux-vdso.so.1 => (0x00007ffff012c000)
       libssl3.so => /usr/lib64/libssl3.so (0x0000003036000000)
       libsmime3.so => /usr/lib64/libsmime3.so (0x0000003035c00000)
       libnss3.so => /usr/lib64/libnss3.so (0x0000003035000000)
       libnssutil3.so =>/usr/lib64/libnssutil3.so (0x0000003034000000)
       libplds4.so => /lib64/libplds4.so (0x0000003033800000)
       libplc4.so => /lib64/libplc4.so (0x0000003033c00000)
       libnspr4.so => /lib64/libnspr4.so (0x0000003034400000)
        libpthread.so.0 =>/lib64/libpthread.so.0 (0x0000003030c00000)
       libdl.so.2 => /lib64/libdl.so.2 (0x0000003031000000)
       libuuid.so.1 => /lib64/libuuid.so.1 (0x0000003035400000)
       libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x0000003036400000)
       librt.so.1 => /lib64/librt.so.1 (0x0000003031400000)
       libboost_thread-mt.so.5 => /usr/lib64/libboost_thread-mt.so.5(0x00000030c8200000)
       libboost_system-mt.so.5 => /usr/lib64/libboost_system-mt.so.5(0x00000030c8e00000)
        libleveldb.so.1 =>/usr/lib64/libleveldb.so.1 (0x00000030c8600000)
       libsnappy.so.1 => /usr/lib64/libsnappy.so.1 (0x00000030c8a00000)
       libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00000030c3e00000)
       libm.so.6 => /lib64/libm.so.6 (0x0000003031800000)
       libc.so.6 => /lib64/libc.so.6 (0x0000003030800000)
       libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000030c4600000)
       libz.so.1 => /lib64/libz.so.1 (0x0000003031c00000)
       /lib64/ld-linux-x86-64.so.2 (0x0000003030000000)


 

4、共享库的搜索路径由动态链接器指定

man ld.so

查找顺序如下

A、 LD_LIBRARY_PATH (不建议修改)
B、 从缓存文件/etc/ld.so.cache中查找,涉及到ldconfig命令 (常用的方法)
修改/etc/ld.so.conf文件,加入共享库的路径,然后运行Ldconfig –v查看
C、  从/usr/lib、/lib中查找

把共享库文件拷贝到/usr/lib或/lib下便于查找

5、共享库命名

Real name 共享库真实名称,比如/usr/lib64/librados.so.2.0.0,包含完整的共享库版本号

Soname 符号链接的名字,只包含共享库的主版本号,如/usr/lib64/librados.so.2-> librados.so.2.0.0,

根据soname决定使用哪个共享库,可以方便升级。比如,有的应用程序依赖librados.so.1,有的依赖librados.so.2,

那么使用librados.so.1,真正的库文件不管是librados.so.1.0.1还是librados.so.1.0.2都可以用。

Linker name 在编译链接时使用,/usr/lib64/librados.so-> /usr/lib64/librados.so.2.0.0,因为编译器只认linker name,所以如果删除了/usr/lib64/librados.so但是/usr/lib64/librados.so.2存在,仍然无法通过编译,编译器会报错:找不到共享库。

 

gcc的编译优化选项有-O0、-O、-O1、-O2、-O3、-Os几种。-O0表示不优化,这是缺省的选项。

-O1、-O2和-O3这几个选项一个比一个优化得更多,编译时间也更长。

-O和-O1相同。-Os表示为缩小目标代码尺寸而优化。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值