GCC编译命令
今天突然被同事问道⼀个GCC编译命令的问题,感觉对相应内容⽣疏了,赶紧整理下相关内容,梳理下相关知识。
GCC命令提供了⾮常多的命令选项,但并不是所有都要熟悉,初学时掌握⼏个常⽤的就可以了,到后⾯再慢慢学习其它选项,免得因选项太多⽽打击了学习的信⼼。
⼀. 常⽤编译命令选项
假设源程序⽂件名为test.c。
1. ⽆选项编译链接
⽤法:#gcc test.c
作⽤:将test.c预处理、汇编、编译并链接形成可执⾏⽂件。这⾥未指定输出⽂件,默认输出为a.ou t。
2. 选项 -o
⽤法:#gcc test.c -o test
作⽤:将test.c预处理、汇编、编译并链接形成可执⾏⽂件test。-o选项⽤来指定输出⽂件的⽂件名。
3. 选项 -E
⽤法:#gcc -E test.c -o test.i
作⽤:将test.c预处理输出test.i⽂件。
4. 选项 -S
⽤法:#gcc -S test.i
作⽤:将预处理输出⽂件test.i汇编成test.s⽂件。
5. 选项 -c
mysql下载之后是个文件夹⽤法:#gcc -c test.s
作⽤:将汇编输出⽂件test.s编译输出test.o⽂件。
6. ⽆选项链接
⽤法:#gcc test.o -o test
作⽤:将编译输出⽂件test.o链接成最终可执⾏⽂件test。
7. 选项-O
⽤法:#gcc -O1 test.c -o test
作⽤:使⽤编译优化级别1编译程序。级别为1~3,级别越⼤优化效果越好,但编译时间越长。
⼆. 多源⽂件的编译⽅法
如果有多个源⽂件,基本上有两种编译⽅法:
[假设有两个源⽂件为test.c和testfun.c]
1. 多个⽂件⼀起编译
⽤法:#gcc testfun.c test.c -o test
作⽤:将testfun.c和test.c分别编译后链接成test可执⾏⽂件。
2. 分别编译各个源⽂件,之后对编译后输出的⽬标⽂件链接。
⽤法:
#gcc -c testfun.c //将testfun.c编译成testfun.o
#gcc -c test.c  //将test.c编译成test.o
#gcc -o testfun.o test.o -o test //将testfun.o和test.o链接成test
以上两种⽅法相⽐较,第⼀中⽅法编译时需要所有⽂件重新编译,⽽第⼆种⽅法可以只重新编译修改的⽂件,未修改的⽂件不⽤重新编译。3库⽂件连接
开发软件时,完全不使⽤第三⽅函数库的情况是⽐较少见的,通常来讲都需要借助许多函数库的⽀持才能够完成相应的功能。从程序员的⾓度看,函数库实际上就是⼀些头⽂件(.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
3.1编译成可执⾏⽂件
⾸先我们要进⾏编译test.c为⽬标⽂件,这个时候需要执⾏
gcc –c –I /usr/dev/mysql/include test.c –o test.o
3.2链接
最后我们把所有⽬标⽂件链接成可执⾏⽂件:
gcc –L /usr/dev/mysql/lib –lmysqlclient test.o –o test
Linux下的库⽂件分为两⼤类分别是动态链接库(通常以.so结尾)和静态链接库(通常以.a结尾),⼆者的区别仅在于程序执⾏时所需的代码是在运⾏时动态加载的,还是在编译时静态加载的。
3.3强制链接时使⽤静态链接库
默认情况下, GCC在链接时优先使⽤动态链接库,只有当动态链接库不存在时才考虑使⽤静态链接库,如果需要的话可以在编译时加上-static选项,强制使⽤静态链接库。
在/usr/dev/mysql/lib⽬录下有链接时所需要的库⽂件libmysqlclient.so和libmysqlclient.a,为了让GCC在链接时只⽤到静态链接库,可以使⽤下⾯的命令:
gcc –L /usr/dev/mysql/lib –static –lmysqlclient test.o –o test
静态库链接时搜索路径顺序:
1. ld会去GCC命令中的参数-L
2. 再gcc的环境变量LIBRARY_PATH
3. 再内定⽬录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的
动态链接时、执⾏时搜索路径顺序:
1. 编译⽬标代码时指定的动态库搜索路径
2. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径
3. 配置⽂件/etc/f中指定的动态库搜索路径
4. 默认的动态库搜索路径/lib
5. 默认的动态库搜索路径/usr/lib
有关环境变量:
LIBRARY_PATH环境变量:指定程序静态链接库⽂件搜索路径
LD_LIBRARY_PATH环境变量:指定程序动态链接库⽂件搜索路径

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。