gcc流水日志
如有不当,欢迎拍砖。索引部分,版权归原作者所有
1>gcc基本用法
代码文件有src1.c src2.c src3.c src4.c
头文件有src1.h src2.h src3.h src4.h
他们都在当前工作目录
一步到位的gcc写法:
gcc src1.c
输出a.out
gcc src1.c -o src_tar
输出src_tar
其实是分成四步进行的:
预处理,编译成汇编代码,汇编成目标文件,链接
gcc -E src1.c -o src1.i
gcc -S src1.i -o src1.s
gcc -c src1.s -o src1.o
gcc src1.o -o src_tar
如果是多个文件也是按照上面四步进行的,有的时候代码文件之间存在依赖关系,必须放在一块进行
e.g gcc src1.c src2.c -o src_tar
gcc -Wall :给出所有的警告
gcc -Werror:编译到有警告的地方,就停止编译。
如果头文件所在的路径并不在gcc的搜索范围之内,编译成目标文件时需要加上
–I +头文件的路径 e.g:/usr/dev/mysql/include
编译成最终执行文件时需要加上
–L +库文件的路径,并+ ‘-l库的名字’ e.g:/usr/dev/mysql/lib –lmysqlclient
–static 强制编译器进行静态链接
PS:如果要是写在makefile中,在最后链接成可执行文件的时候,如果用到动态链接库,千万记得加上”-l库文件名“,这样可以节约你很长时间(手动滑稽__)
2>库文件连接
开发软件时,完全不使用第三方函数库的情况是比较少见的,通常来讲都需要借助许多函数库的支持才能够完成相应的功能。从程序员的角度看,函数库实际上就是一些头文件(.h)和库文件(so、或lib、dll)的集合。。虽然Linux下的大多数函数都默认将头文件放到/usr/include/目录下,而库文件则放到/usr/lib/目录下;Windows所使用的库文件主要放在Visual Stido的目录下的include和lib,以及系统文件夹下。但也有的时候,我们要用的库不再这些目录下,所以GCC在编译时必须用自己的办法来查找所需要的头文件和库文件。
例如我们的程序test.c是在linux上使用c连接mysql,这个时候我们需要去mysql官网下载MySQL Connectors的C库,下载下来解压之后,有一个include文件夹,里面包含mysql connectors的头文件,还有一个lib文件夹,里面包含二进制so文件libmysqlclient.so
其中inclulde文件夹的路径是/usr/dev/mysql/include,lib文件夹是/usr/dev/mysql/lib
1编译成可执行文件
首先我们要进行编译test.c为目标文件,这个时候需要执行
gcc –c –I /usr/dev/mysql/include test.c –o test.o
2链接
最后我们把所有目标文件链接成可执行文件:
gcc –L /usr/dev/mysql/lib –lmysqlclient test.o –o test
Linux下的库文件分为两大类分别是动态链接库(通常以.so结尾)和静态链接库(通常以.a结尾),二者的区别仅在于程序执行时所需的代码是在运行时动态加载的,还是在编译时静态加载的。
3强制链接时使用静态链接库
默认情况下, GCC在链接时优先使用动态链接库,只有当动态链接库不存在时才考虑使用静态链接库,如果需要的话可以在编译时加上-static选项,强制使用静态链接库。
在/usr/dev/mysql/lib目录下有链接时所需要的库文件libmysqlclient.so和libmysqlclient.a,为了让GCC在链接时只用到静态链接库,可以使用下面的命令:
gcc –L /usr/dev/mysql/lib –static –lmysqlclient test.o –o test
静态库链接时搜索路径顺序:
- ld会去找GCC命令中的参数-L
- 再找gcc的环境变量LIBRARY_PATH
- 再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的
动态链接时、执行时搜索路径顺序: - 编译目标代码时指定的动态库搜索路径
- 环境变量LD_LIBRARY_PATH指定的动态库搜索路径
- 配置文件/etc/ld.so.conf中指定的动态库搜索路径
- 默认的动态库搜索路径/lib
- 默认的动态库搜索路径/usr/lib
有关环境变量:
LIBRARY_PATH环境变量:指定程序静态链接库文件搜索路径
LD_LIBRARY_PATH环境变量:指定程序动态链接库文件搜索路径
如有不当,欢迎拍砖。索引部分,版权归原作者所有
感谢~参考链接
http://www.cnblogs.com/ggjucheng/archive/2011/12/14/2287738.html