GCC Tutorial

GNU C Compiler Tutorial

gcc是一个强大的编译器,该编译器支持多种编程语言的编译,例如:C语言,C++语言,Java语言,Objectiva-C语言等,并且编译出的程序是跨平台可移植的,其实说gcc是编译器是不太准确的,因为gcc除了具有编译功能外,还具有预处理,链接等功能

可执行程序生成的过程

这里以C语言为例,要从源代码生成一个程序,涉及到的过程有:

  1. 预处理

    主要的任务有,替换源码中的宏(即宏扩展),将include的文件内容插入(即头文件包含),处理条件编译代码(根据条件编译决定哪些代码将参与到下一步的编译过程),移除源码中的注释内容

  2. 编译

    该步骤进行词法分析,语法分析,中间代码生成,汇编代码的生成,简单来说就是编译器将高级语言代码转换为汇编代码的过程

  3. 汇编

    汇编器将汇编代码转换为机器代码的过程

  4. 链接

    具体可以分为静态和动态链接两类,静态链接直接将引用/依赖的库代码在程序中拷贝一份,动态链接一般是程序中引用/依赖到了共享对象(或windows叫作动态链接库),此时只需将一些关于共享对象的信息拷贝到程序中即可

gcc常见用法

直接由源码输出可执行程序

    $ gcc test.c      # 默认可执行程序名为a.out

    $ gcc test.c -o program_filename  # 指定可执行程序名

进行到预处理

    $ gcc -E test.c       # 默认预处理结构输出到stdout

    $ gcc -E test.c -o test.i     # 将预处理的结果输出到指定文件

进行到汇编代码生成

    $ gcc -S test.c     # 默认汇编文件为test.s,可以用-o filename更改

    $ gcc -S test.i     # 不仅可以用源码,也可用预处理的结果来生成汇编文件

进行到编译(即生成机器代码)

    $ gcc -c test.c     # 默认输出文件为test.o,可用-o filename更改

    $ gcc -c test.i     # 可以用预处理文件生成目标代码

    $ gcc -c test.s     # 可用汇编文件生成目标代码

链接

    $ gcc test.o -o program_filename

多个源文件的生成

    $ gcc test1.c test2.c -o test

使用外部库

    $ gcc -c -I /path-to-some/include test.c -o test.o      # 包含外部库

    $ gcc -L /path-to-some/lib -lfilename test.o -o test     # 不需要前缀lib以及扩展名.a或.so

    $ gcc -L /path-to-some/lib -static -lfilename test.o -o test    # 默认优先使用动态链接库,指定-static在强制使用静态链接库

题外话

创建静态链接库

    $ ar crv libtest.a test.o

注意:libtest.a是遵循命名规范的,库文件名要以lib开头,静态链接库扩展名为.a

创建动态链接库

    $ gcc -shared -fPCI test.o -o libtest.so

注意:动态链接库的扩展名为.so,指定-fPCI共享对象编译为位置独立的代码,否则依然在使用到它时到处拷贝

静态/动态链接库位置查找顺序

1. 根据参数-L指定的位置查找

2. 根据环境变量LIBRARY_PATH/LD_LIBRARY_PATH

3. 动态链接库还可以通过配置文件/etc/ld.so.conf中指定的位置查找

4. gcc指定的系统默认位置/lib, /usr/lib, /usr/local/lib
Xiao Wenbin
Xiao Wenbin
Natural Language Processing Engineer

My research interests include machine learning, information retrieval and natural language processing.

Related