GNU 编译工具——gcc

GNU 编译工具 —— gccc++

1、语法

    gcc  [选项参数] c文件函数

2、选项参数

    一、指定输出文件名

        -o 指定输出文件 工具

gcc -o main ch01.c

    二、警告与提示
优化

         -pedantic   检测不符合ANSI/ISO C语言标准的源代码,使用扩展语法的地方将产生警告信息spa

        -Wall 生成尽量多的警告信息。调试

        -Werror   要求编译器将警告当作错误进行处理。code

    三、指定编译文件类型

        -x   指定编译代码类型,c、c++、assembler,none。None根据扩展名自动确认。 对象

gcc –x c -Wall –o main ch01.c

    四、生成调试信息与优化

        -g   生成调试信息字符串

        -O   优化编译器

    五、建议:在编译任何程序的时候都带上-Wall选项

3、文件后缀名

    .a   静态对象库

    .c   须要预处理的C语言源代码

    .h   C语言源代码头文件

    .i   不须要预处理的C语言源代码

    .o   目标文件

    .s   汇编语言代码

    .so   共享对象库

4、编译过程

    a.预处理。

        一、语法:gcc -E C源代码文件

        二、注意:

            预处理每次只能处理一个文件。不能处理多个文件,就是每一个.c文件对应一个.i文件。

            不指定 –o 选项,预处理的结果输出到标准输出设备。

        三、预编译指令

                #define              定义宏

                #elif                   else if 多选分支

                #else                  与#if、#ifndef、#ifdef结合使用

                #error                产生错误、挂起与处理程序

                #if                      断定

                #endif                结束断定

                #ifdef                 断定宏是否认义

                #ifndef               断定宏是否认义

                #include             将指定的文件插入#include的位置

                #include_next     与#include同样,但从当前目录以后的目录查找

                #line                   指定行号

                #pragma            提供额外信息的标准方法,可用来指定平台

                #undef               删除宏

                #warning            建立一个警告

                ##                      链接操做符号,用于宏内链接两个字符串

    b.编译

        编译环境变量:

        C_INCLUDE_PATH:   查找头文件的目录——C。

        CPATH:  查找头文件,至关于-l选项。

        CPLUS_INCLUDE_PATH:  查找头文件的目录——C++。

        LD_LIBRARY_PATH:  编译没有影响,主要影响运行。指定目录便于定位共享库。

        LIBRARY_PATH:  查找链接文件,至关于-l选项

    c.汇编

        一、编译成汇编

gcc -S  ch01.c ch01_1.c

        二、编译汇编

gcc ch01.s ch01_1.s -o main

    d.连接

5、建立静态库

    A、建立静态库

        a、编译静态库

gcc -c -static ch01_1.c

            说明:

                其中-static可选,可阻止gcc使用共享库,不使用共享库会使可执行文件变大,但会减小运行时间开销

        b、生成静态库

ar -r libmy.a  ch01_1.o

        c、使用静态库

gcc -o main ch01.c libmy.a

            若是libmy.a在LIBRARY_PATH的指定目录中,还能够采用以下方式编译。

gcc  ch01.c  -o main –lmy

    B、建立共享库

        a、编译共享库

            一、编译成位置独立代码的目标文件,选项-fpic

gcc -c -fpic ch01_1.c

            二、编译成共享库,选项-shared

gcc -shared ch01_1.o -o libmy.so

            三、使用一条指令

gcc -fpic -shared  ch01_1.c -o libmy.so

        b、定位共享库

            一、共享库编译的时候与静态库同样依赖LIBRARAY_PATH,运行的时候依赖LD_LIBRARY_PATH。

            二、规则:

                    查找LD_LIBRARY_PATH,目录使用冒号分隔。

                    /ect/ld.so.cache中找到的列表。工具ldconfig维护。

                    目录/lib

                    目录/usr/lib

        c、使用共享库

gcc ch01.c libmy.so -o main

        d、共享库的四个函数

            头文件:#include <dlfcn.h>

void *dlopen(const char *filename, int flag);

char *dlerror(void);

void *dlsym(void *handle, const char *symbol);

int dlclose(void *handle);

        其中dlopen的参数flag的含义以下:

            RTLD_LAZY:符号查找时候才加载。

            RTLD_NOW:立刻加载。

相关文章
相关标签/搜索