zoukankan      html  css  js  c++  java
  • Linux常用基础(三)

    1、gcc编译器

      (1)简介

        前期的GCC是GNU C Compiler,仅仅用于C语言的编译,经过多年的发展,现在的GCC为GNU Compiler Collection,并且目前支持多种编程语言的编译。

      (2)gcc的编译过程

        gcc的编译过程包括了四个过程,分别是预处理、编译、汇编和链接,如下所示:

     

        1)预处理

          主要是完成头文件的展开,c文件中宏的替换展开,去掉有关的注释。

          命令:gcc -E myapp.c -o myapp.i

            -E:生成预处理的文件

            -o:生成目标文件

        2)编译

          预处理后的文件仍然是c文件,编译的过程是把c文件编译成汇编文件。

          命令:gcc -S myapp.i -o myapp.s

            -S:生成汇编文件

        3)汇编

          将汇编文件变成二进制文件。

          命令:gcc  -c myapp.s -o myapp.o

            -c:编译子程序

        4)链接

          将相关的函数库链接到目标文件中去,最终生成可执行文件。

          命令:gcc myapp.o -o myapp

      (3)其它命令参数

        1)查看gcc版本号:-v / --version

        2)指定头文件目录:-I + 目录

        3)编译时定义宏:-D

        4)编译优化:-On (n=0-3:当n为0不优化,当n为3优化级别最高)

        5)提示更多的警告信息:-Wall

        6)包含调试信息:-g (GDB调试需要加此参数)

    2、静态库

      (1)命名规则

        1)lib + 库的名字 + .a

        2)例如:libmytest.a(库的名字为mytest)

      (2)制作步骤

        1)生成对应的.o文件,编译时添加-c参数

          命令:gcc mytest.c -c

        2)将生成的.o文件打包

          命令:ar rcs + 静态库的名字(libmytest.a)+ 生成的所有.o文件

      (3)发布和使用静态库

        1)将打包好的lib和头文件发布出去,头文件提供API接口的相关信息

        2)静态库使用方法

          命令1:gcc main.c -I + 头文件路径lib/libmytest.a -o myapp

          命令2:gcc main.c -I + 头文件 -L + 库的路径 -l + 库的名字 -o myapp

      (4)优缺点

        优点:

          1)发布程序的时候,不需要提供相应的库

          2)加载库的速度快

        缺点:

          1)库被打包到应用程序中,导致应用程序的体积很大

          2)一旦库发生了变化,则应用程序需要重新编译

    3、共享库(动态库)

      (1)命名规则

        1)lib + 库的名字 + .so

        2)例如:libmytest.so

      (2)制作步骤

        1)生成与位置无关的代码(生成与位置无关的.o文件)

          命令:gcc -fPIC -c *.c -I + 头文件路径

        2)将.o打包成共享库(动态库)

          命令:gcc -shared -o libmyapp.so *.o -I 头文件路径

      (3)发布和使用共享库

        发布:将.so文件和头文件进行发布

        使用:

          命令1:gcc main.c lib/libmyapp.so -o myapp -I 头文件路径

          命令2:gcc main.c -I + 头文件路径 -L + 库的路径文件 -l + 库的名字 -o myapp

      (4)程序执行时动态库无法被加载的问题解决

        原因:环境变量中找不到动态库的路径,程序运行时链接不成功

        解决:

          1)将动态库拷贝到路径/lib中去(不允许使用)

          2)将动态库路径添加到额外的链接环境变量LD_LIBRARY_PATH

            命令:export LD_LIBRARY_PATH=./lib(动态库的路径)

          3)将LD_LIBRARY_PATH永久改变

            修改~/.bashrc配置文件,在文件最后export

          4)通过修改动态连接器的配置文件

            1)需要找到动态链接器的配置文件

              命令:ls -l /etc/ld.so.conf

            2)动态库的路径写入到配置文件中

              命令:vim /etc/ld.so.conf

            3)将动态库的路径添加到最后一行,然后保存退出vim

            4)更新链接配置文件

              命令:sudo ldconfig -v

      (5)优缺点

        优点:

          1)应用程序的体积小

          2)动态库更新,不一定需要重新编译应用程序

        缺点:

          1)发布程序的时候,需要发布动态库给用户

          2)动态库并没有打包到应用程序中去,加载速度相对较慢

  • 相关阅读:
    fzuoj Problem 2177 ytaaa
    zoj The 12th Zhejiang Provincial Collegiate Programming Contest Capture the Flag
    zoj The 12th Zhejiang Provincial Collegiate Programming Contest Team Formation
    zoj The 12th Zhejiang Provincial Collegiate Programming Contest Beauty of Array
    zoj The 12th Zhejiang Provincial Collegiate Programming Contest Lunch Time
    zoj The 12th Zhejiang Provincial Collegiate Programming Contest Convert QWERTY to Dvorak
    zoj The 12th Zhejiang Provincial Collegiate Programming Contest May Day Holiday
    zoj The 12th Zhejiang Provincial Collegiate Programming Contest Demacia of the Ancients
    zjuoj The 12th Zhejiang Provincial Collegiate Programming Contest Ace of Aces
    csuoj 1335: 高桥和低桥
  • 原文地址:https://www.cnblogs.com/Cqlismy/p/11496053.html
Copyright © 2011-2022 走看看