美文网首页
C语言编译 - gcc 编译指令

C语言编译 - gcc 编译指令

作者: 交大小丑 | 来源:发表于2020-07-05 12:05 被阅读0次

gcc 基本编译指令

  • 预处理 -E (.i) 编译 -S (.s) 汇编-c (.o) 连接-o
  • -o:将结果输出并指定输出文件的文件名
  1. 预处理
    gcc -E hello.c -o hello.i
    -E:仅执行编译预处理

  2. 编译为汇编代码
    gcc -S hello.c(.i) -o hello.s
    -S:将C代码转换为汇编代码

  3. 汇编:
    gcc -c hello.c -o hello.o
    -c:仅执行编译操作,不进行连接操作

  4. 连接:
    gcc hello.o -o hello

gcc 编译指令大全

一. 常用编译命令选项

假设源程序文件名为test.c。

  1. 无选项编译链接
    用法:gcc test.c
    作用:将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。

  2. 选项 -o
    用法:gcc test.c -o test
    作用:将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。

  3. 选项 -E
    用法:gcc -E test.c -o test.i
    作用:将test.c预处理输出test.i文件。

  4. 选项 -S
    用法:gcc -S test.i
    作用:将预处理输出文件test.i汇编成test.s文件。

  5. 选项 -c
    用法:gcc -c test.s
    作用:将汇编输出文件test.s编译输出test.o文件。

  6. 无选项链接
    用法:gcc test.o -o test
    作用:将编译输出文件test.o链接成最终可执行文件test。

  7. 选项-O
    用法:gcc -O1 test.c -o test
    作用:使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长。

二. 多源文件的编译方法

如果有多个源文件,基本上有两种编译方法:
[假设有两个源文件为test.c和testfun.c]

  1. 多个文件一起编译
    用法:gcc testfun.c test.c -o test
    作用:将testfun.c和test.c分别编译后链接成test可执行文件。

  2. 分别编译各个源文件,之后对编译后输出的目标文件链接。
    用法:
    gcc -c testfun.c //将testfun.c编译成testfun.o
    gcc -c test.c //将test.c编译成test.o
    gcc -o testfun.o test.o -o test //将testfun.o和test.o链接成test
    作用:以上两种方法相比较,第一中方法编译时需要所有文件重新编译,而第二种方法可以只重新编译修改的文件,未修改的文件不用重新编译。

三、库文件连接
  • 开发软件时,完全不使用第三方函数库的情况是比较少见的,通常来讲都需要借助许多函数库的支持才能够完成相应的功能。从程序员的角度看,函数库实际上就是一些头文件(.h)和库文件(so、或lib、dll)的集合。。虽然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
  1. 编译成可执行文件
    首先我们要进行编译test.c为目标文件,这个时候需要执行
    gcc –c –I /usr/dev/mysql/include test.c –o test.o

  2. 链接
    最后我们把所有目标文件链接成可执行文件:
    gcc –L /usr/dev/mysql/lib –lmysqlclient test.o –o test
    Linux下的库文件分为两大类分别是动态链接库(通常以.so结尾)和静态链接库(通常以.a结尾),二者的区别仅在于程序执行时所需的代码是在运行时动态加载的,还是在编译时静态加载的。

  3. 强制链接时使用静态链接库
    默认情况下, GCC在链接时优先使用动态链接库,只有当动态链接库不存在时才考虑使用静态链接库,如果需要的话可以在编译时加上-static选项,强制使用静态链接库。
    在/usr/dev/mysql/lib目录下有链接时所需要的库文件libmysqlclient.so和libmysqlclient.a,为了让GCC在链接时只用到静态链接库,可以使用下面的命令:
    gcc –L /usr/dev/mysql/lib –static –lmysqlclient test.o –o test

    1. 静态库链接时搜索路径顺序:
      1. ld会去找GCC命令中的参数-L
      2. 再找gcc的环境变量LIBRARY_PATH
      3. 再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的
    2. 动态链接时、执行时搜索路径顺序:
      1. 编译目标代码时指定的动态库搜索路径
      2. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径
      3. 配置文件/etc/ld.so.conf中指定的动态库搜索路径
      4. 默认的动态库搜索路径/lib
      5. 默认的动态库搜索路径/usr/lib
    3. 有关环境变量:
      *. LIBRARY_PATH环境变量:指定程序静态链接库文件搜索路径
      *. LD_LIBRARY_PATH环境变量:指定程序动态链接库文件搜索路径

相关文章

  • [C++之旅] 0 Mac下编译运行C/C++

    [C++之旅] 0 Mac下编译运行C/C++ 编译c语言时采用gcc指令 编译c++语言时采用g++指令 以下以...

  • C语言编译 - gcc 编译指令

    gcc 基本编译指令 预处理 -E (.i) 编译 -S (.s) 汇编-c (.o) 连接-o -o:将结果输出...

  • centos安装mysql5.5

    相关准备 gcc、gcc-c++//c语言编译 cmake//mysql编译 ncurses-devel//字符终...

  • MDK编译过程及文件类型全解

    C语言编译步骤 1.预处理 gcc -E2.编译 gcc -S3.汇编 gcc -C4....

  • 2021-02-19 cc/gcc/g++/CC

    gcc全称是Gun C语言编译器。原本只能处理C语言,gcc很快地扩展,现在的gcc可以说是GNU编译器集合(可编...

  • Linux高级环境编程

    1. 编译的四个步骤: 预处理gcc -E test.c -o test.i 编译:将高级语言编译成汇编语言gcc...

  • 面试常问C++基础

    有关语言基础: c/c++程序的编译过程(GCC的编译流程) 强类型语言 VS 弱类型语言 数组和指针的区别 字符...

  • 2018-04-16安装nginx

    一.安装gcc 安装 nginx 需要先将官网下载的源码进行编译,nginx是C语言编写的,编译依赖 gcc 环境...

  • 2018-10-21

    树莓派GDB调试程序 编译程序 gcc -g test.c -o test -lwiringPi通过上述编译指令编...

  • Linux软件安装

    源码包通过编译才能执行,在Linux中编译C语言源代码需要使用gcc编译器,但是默认安装的时候是没有安装gcc的,...

网友评论

      本文标题:C语言编译 - gcc 编译指令

      本文链接:https://www.haomeiwen.com/subject/ddzmqktx.html