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表示为缩小目标代码尺寸而优化。
- GCC编译归纳总结
- gcc编译选项总结
- gcc编译错误总结
- gcc编译选项总结
- GCC编译总结
- gcc 编译总结
- GCC 常用编译选项总结
- gcc相关编译选项总结
- Linux下 GCC编译总结
- 归纳总结
- 编译Android源码和内核源码的归纳总结
- 常用的GCC编译选项总结
- gcc 常见的编译错误,警告总结
- GCC编译过程中出错问题总结
- gcc编译链接的一些总结
- 对gcc编译和linux下proc编译的总结
- gcc编译和linux下proc编译的总结
- linux下编译arm-gcc的交叉编译总结
- 2016/09/27 20:08 The Best of Yourth
- 网络超时检测-setsockopt()
- uva 202 分数转化小数
- 第四周项目5—建立双链表算法库
- 静态链接与动态链接的区别
- GCC编译归纳总结
- 小米秋招第二题
- cocos2dx 3.10 实现天天跑酷金币吸入效果, 分享给大家
- 我的学习计划
- Imagemagick中解决convert: no decode delegate for this image format 问题
- 自定义Toast、View
- java.lang.Math类中的方法
- [9]DevOps 自动化运维工具Chef---如何解决在Window平台上执行一些knife子命令时所报的错误, knife search, knife status?
- 使用Apache commons轻松发送Email