GCC编译归纳总结

来源:互联网 发布:北京工业软件开发 编辑:程序博客网 时间:2024/05/16 14:04

概述

一般在做项目的时候,都忽略了这个步骤,因为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.cgcc -shared -o libstack.so stack.o push.opop.o is_empty.ogcc 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