gcc的使用

1. gcc

gcc是一个 GUN C compiler

2. 简单编译

test.c 

#include<stdio.h>

int main()

{

printf("this is a test\n");

return 0;
}

一步到位的编译时:

gcc test.c -o test

实际上,上面经过了四个阶段进行的,即预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编 (Assembly)和连接(Linking)。

2.1 预处理

gcc -E test.c -o test.i  或  gcc -E test.c 

test.i文件中存放着经过预处理的之后的代码。

gcc -E 选项可以让编译器在预处理候停止,并输出预处理结果,本次则是将头文件的内容放入test.c中。

2.2 编译为汇编代码

预处理候,可直接对生成的test.i 生成汇编代码:

gcc -S test.i -o test.s

gcc -S 选项表示在编译期间生成汇编代码后停止

2.3 汇编(Assembly)

对于汇编代码test.s,gas汇编器负责将其编译为目标文件:

gcc -c test.s -o test.o

2.4链接(Linking)

gcc的链接器是有gas提供的,负责将程序的目标文件与所需的所有附加的目标文件连接起来,最终生成可执行文件。附加的目标文件包括静态连接库和动态连接库。对于上一小节中生成的test.o,将其与C标准输入输出库进行连接,最终生成程序test

gcc  test.o -o test

3. 多个程序文件的编译

通常一个程序是由多个源程序组成的,可使用如下方式:

gcc test1.c test2.c -o test

或者:

gcc -c test1.c -o test1.o 

gcc -c test2.c -o test2.o

gcc test1.o test2.o -o test


4.检查错误

gcc -pedantic test.c -o test

pedantic选项能够帮助程序员发现一些不符合 ANSI/ISO C标准的代码,但不是全部,事实上只有ANSI/ISO C语言标准中要求进行编译器诊断的那些情况,才有可能被GCC发现并提出警告。

除了-pedantic之外,GCC还有一些其它编译选项也能够产生有用的警告信息。这些选项大多以-W开头,其中最有价值的当数-Wall了,使用它能够使GCC产生尽可能多的警告信息。

gcc -Wall test.c -o test

在编译程序时带上-Werror选项,那么GCC会在所有产生警告的地方停止编译,迫使程序员对自己的代码进行修改

gcc -Werror test.c -o test


5. 库文件链接

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

5.1 编译成可执行文件

gcc -c ev/mysql/lib test.c -o test.o

5.2 链接

gcc –L /usr/dev/mysql/lib –lmysqlclient test.o –o test
-L指定要搜寻的库,-l指定要链接的库名称
 
 
6. 参数-fPIC
PIC:position independent code 
如果不加-fPIC,则加载.so文件的代码段时,代码段引用的数据对象需要重定位, 重定位会修改代码段的内容,这就造成每个使用这个.so文件代码段的进程在内核里都会生成这个.so文件代码段的copy.每个copy都不一样,取决于 这个.so文件代码段和数据段内存映射的位置.
加fPIC编译出来的so,是要再加载时根据加载到的位置再次重定位的.(因为它里面的代码并不是位置无关代码)
如果被多个应用程序共同使用,那么它们必须每个程序维护一份so的代码副本了.(因为so被每个程序加载的位置都不同,显然这些重定位后的代码也不同,当然不能共享)
gcc -shared -fPIC liberr.c -o liberr.so
从GCC来看,shared应该是包含fPIC选项的,但似乎不是所以系统都支持,所以最好显式加上fPIC选项。参见如下
`-shared'      Produce a shared object which can then be linked with other      objects to form an executable.  Not all systems support this      option.  For predictable results, you must also specify the same      set of options that were used to generate code (`-fpic', `-fPIC',      or model suboptions) when you specify this option.(1)
6. -g 
gcc -g 表示对生成的可执行文件加上调试信息,这样才可以使用gdb
 
 


猜你喜欢

转载自blog.csdn.net/zhongyoubing/article/details/77649168