欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

GNU 编译工具——gcc

程序员文章站 2022-07-14 12:48:14
...

GNU 编译工具 —— gcc

一、语法

    gcc  [选项参数] c文件

二、选项参数

    1、指定输出文件名

        -o 指定输出文件 

gcc -o main ch01.c

    2、警告与提示

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

        -Wall 生成尽可能多的警告信息。

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

    3、指定编译文件类型

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

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

    4、生成调试信息与优化

        -g   生成调试信息

        -O   优化

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

三、文件后缀名

    .a   静态对象库

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

    .h   C语言源代码头文件

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

    .o   目标文件

    .s   汇编语言代码

    .so   共享对象库

四、编译过程

    a.预处理。

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

        2、注意:

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

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

        3、预编译指令

                #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.汇编

        1、编译成汇编

gcc -S  ch01.c ch01_1.c

        2、编译汇编

gcc ch01.s ch01_1.s -o main

    d.链接

五、创建静态库

    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、编译共享库

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

gcc -c -fpic ch01_1.c

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

gcc -shared ch01_1.o -o libmy.so

            3、使用一条指令

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

        b、定位共享库

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

            2、规则:

                    查找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:马上加载。


转载于:https://my.oschina.net/u/1169027/blog/186402