精华内容
下载资源
问答
  • gcc编译过程

    2013-01-03 13:24:41
    系统的讲解了gcc编译过程,可以对gcc编译过程有一个全面的了解
  • GCC编译过程

    千次阅读 2019-05-24 17:56:19
    目前 Linux 下最常用的 C 语言编译器是 GCC ( GNU Compiler Collection ),它是 GNU 项目中符合 ANSI C 标准的编译系统,能够编译用 C 、 C++ 和 Object C 等语言编写的程序。 GCC 不仅功能非常强大,结构也异常...

    1. GCC定义

    目前 Linux 下最常用的 C 语言编译器是 GCC ( GNU Compiler Collection ),它是 GNU 项目中符合 ANSI C 标准的编译系统,能够编译用 C 、C++ 和 Object C 等语言编写的程序。 GCC 不仅功能非常强大,结构也异常灵活。最值得称道的一点就是它可以通过不同的前端模块来支持各种语言,如Java、Fortran、Pascal、Modula-3 和 Ada 等。开放、自由和灵活是 Linux 的魅力所在,而这一点在 GCC 上的体现就是程序员通过它能够更好地控制整个编译过程。在使用 GCC 编译程序时,编译过程可以被细分为四个阶段:

    1. 预处理( Pre-Processing )
    2. 编译( Compiling )
    3. 汇编( Assembling )
    4. 链接( Linking )

    Linux 程序员可以根据自己的需要让 GCC 在编译的任何阶段结束,以便检查或使用编译器在该阶段的输出信息,或者对最后生成的二进制文件进行控制,以便通过加入不同数量和种类的调试代码来为今后的调试做好准备。和其它常用的编译器一样, GCC 也提供了灵活而强大的代码优化功能,利用它可以生成执行效率更高的代码。
    GCC 提供了 30 多条警告信息和 3 个警告级别,使用它们有助于增强程序的稳定性和可移植性。此外, GCC 还对标准的 C 和 C++ 语言进行了大量的扩展,提高程序的执行效率,有助于编译器进行代码优化,能够减轻编程的工作量。

    2. GCC编译过程

    1. gcc 预处理阶段:主要对包含的头文件(#include)和宏定义(#define#ifdef …)进行处理。可以使用“gcc -E” 让 gcc 在预处理之后停止编译过程,生成 *.i 文件:
      gcc -E hello.c -o hello.i
      
    2. gcc 编译阶段:gcc 首先要检查代码的规范性,是否有语法错误等。以确定代码实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。用户可以使用-S选项进行查看,该选项只进行编译而不进行汇编,生成汇编代码:
      gcc -S hello.i -o hello.s
      
    3. gcc 汇编阶段:生成目标代码 *.o ;有两种方式:使用 gcc 直接从源代码生成目标代码 gcc -c *.s -o *.o 以及使用汇编器从汇编代码生成目标代码 as *.s -o *.o
      gcc -c hello.s -o hello.o
      as hello.s -o hello.o
      
      也可以直接使用as *.s, 将执行汇编、链接过程生成可执行文件a.out, 可以像上面使用-o选项指定输出文件的格式。
    4. gcc 链接阶段:生成可执行文件;可以生成的可执行文件格式有:a.out/*/,当然可能还有其它格式。
      gcc hello.o     生成可执行文件 a.out
      gcc hello.o -o hello        生成可执行文件 hello
      

    3. GCC常用编译选项:

    选项描述
    -c只激活预处理、编译、和汇编,也就是生成obj文件
    -S只激活预处理和编译,就是指把源代码编译成为汇编代码。
    -E只激活预处理,不生成文档,需要把它重定向到一个输出文档里。
    -o指定目标名称,缺省的时候 gcc 编译出来的文档是a.out
    -ansi关闭 GUN C 中和 ANSI C 不兼容的特性,激活 ANSI C 的专有特性。
    -Dmacro相当于C语言中的 #define macro
    -Dmacro=defn相当于C语言中的 #define macro=defn
    -Umacro相当于C语言中的 #undef macro
    -Idir指定头文件路径
    -llibrary指定库
    -Ldir编译的时候,指定搜索库的路径。
    -g指示编译器,在编译的时候,产生调试信息。
    -static此选项将禁止使用动态库,所以,编译出来的东西,一般都很大。
    -share此选项将尽量使用动态库,所以生成文档比较小,但是需要系统由动态库。
    -O0 -O1 -O2 -O3编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
    -Wall会打开一些很有用的警告选项,建议编译时加此选项。
    -std指定C标准,如-std=c99使用 C99 标准;-std=gnu99,使用 C99 再加上 GNU 的一些扩展。

    4. GCC链接库文件的使用

    在 linux 下开发软件时,完全不使用第三方函数库的情况是比较少见的,通常来讲都需要借助一个或多个函数库的支持才能够完成相应的功能。从程序员的角度看,函数库实际上就是一些头文件(.h)和库文件(.so或者.a)的集合。虽然 Linux 下的大多数函数都默认将头文件放到/usr/include/目录下,而库文件则放到/usr/lib/目录下,但并不是所有的情况都是这样。正因如此, GCC 在编译时必须有自己的办法来查找所需要的头文件和库文件, GCC 采用搜索目录的办法来查找所需要的文件。

    4.1 添加头文件

    -I 选项可以向 GCC 的头文件搜索路径中添加新的目录。例如,如果在/home/justin/include/目录下有编译时所需要的头文件,为了让 GCC 能够顺利地找到它们,就可以使用-I选项:

    gcc foo.c -I /home/justin/include -o foo    # 指定头文件目录
    
    4.2 添加库文件

    同样,如果使用了不在标准位置的库文件,那么可以通过 -L 选项向 GCC 的库文件搜索路径中添加新的目录。例如,如果在/home/xiaowp/lib/目录下有链接时所需要的库文件libfoo.so,为了让 GCC 能够顺利地找到它,可以使用下面的命令:

    gcc foo.c -L /home/justin/lib -lfoo -o foo   # 指定库目录和库名称
    

    值得好好解释一下的是 -l 选项,它指示 GCC 去连接库文件 libfoo.so。 Linux 下的库文件在命名时有一个约定,那就是应该以lib 三个字母开头,由于所有的库文件都遵循了同样的规范,因此在用 -l 选项指定链接的库文件名时可以省去lib 三个字母,也就是说GCC 在对-lfoo进行处理时,会自动去链接名为libfoo.so

    4.3 动态库与静态库

    Linux 下的库文件分为两大类分别是动态链接库(通常以 .so 结尾)和静态链接库(通常以 .a 结尾),两者的差别仅在程序执行时所需的代码是在运行时动态加载的,还是在编译时静态加载的 。默认情况下,GCC 在链接时优先使用动态链接库,只有当动态链接库不存在时才考虑使用静态链接库,如果需要的话可以在编译时加上 -static 选项,强制使用静态链接库。例如,如果在home/justin/lib/ 目录下有链接时所需要的库文件libfoo.solibfoo.a,为了让GCC 在链接时只用到静态链接库,可以使用下面的命令:

    gcc foo.c -L /home/justin/lib -static -lfoo -o foo
    

    动态链接库和静态链接库的详细介绍

    本文转载自:https://www.cnblogs.com/king-lps/p/7757919.html

    展开全文
  • gcc 编译过程

    千次阅读 2013-04-30 11:15:43
    平时我们使用gcc 编译C程序,我们通常只用 ...其实我们可以使用手动编译来了解整个gcc编译过程! 我们使用最简单的Hello World 程序做示例: #include "stdio.h" int main() { printf("Hello World\n"); retur

        平时我们使用gcc 编译C程序,我们通常只用 gcc  hello.c  -o  hello 之类的,顶多为了gdb调试再使用 -g 参数!

    其实我们可以使用手动编译来了解整个gcc编译的过程!

    我们使用最简单的Hello World 程序做示例:

    #include "stdio.h"
    int main()
    {
        printf("Hello World\n");
        return  0;
    }


    1 、预处理(Pre-processing)

    在该阶段,编译器将C源代码中的包含的头文件如stdio.h编译进来,用户可以使用gcc的选项”-E”进行查看。

     用法:       gcc -E hello.c -o  hello.i

    作用:将hello.c预处理输出hello.i文件。

    #ls
    hello.c  
    #gcc -E hello.c -o hello.i
    #ls
    hello.c  hello.i
    
    使用vim 查看hello.i 可以看到 hello.i中包括很多很多头文件:

    # 1 "hello.c"
    # 1 "<命令行>"
    # 1 "hello.c"
    # 1 "/usr/include/stdio.h" 1 3 4
    # 28 "/usr/include/stdio.h" 3 4
    # 1 "/usr/include/features.h" 1 3 4
    # 324 "/usr/include/features.h" 3 4
    # 1 "/usr/include/i386-linux-gnu/bits/predefs.h" 1 3 4
    # 325 "/usr/include/features.h" 2 3 4
    # 357 "/usr/include/features.h" 3 4
    ……
    extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
    # 940 "/usr/include/stdio.h" 3 4
    
    # 2 "hello.c" 2
    int main()
    {
     printf("Hello World\n");
     return 0;
    }
    


    我们也可以使用  gcc -M hello.c  生成文件关联的信息。包含目标文件所依赖的所有源代码。        

    #ls
    hello.c  hello.i
    #gcc -M hello.c 
    hello.o: hello.c /usr/include/stdio.h /usr/include/features.h \
     /usr/include/i386-linux-gnu/bits/predefs.h \
     /usr/include/i386-linux-gnu/sys/cdefs.h \
     /usr/include/i386-linux-gnu/bits/wordsize.h \
     /usr/include/i386-linux-gnu/gnu/stubs.h \
     /usr/include/i386-linux-gnu/gnu/stubs-32.h \
     /usr/lib/gcc/i686-linux-gnu/4.7/include/stddef.h \
     /usr/include/i386-linux-gnu/bits/types.h \
     /usr/include/i386-linux-gnu/bits/typesizes.h /usr/include/libio.h \
     /usr/include/_G_config.h /usr/include/wchar.h \
     /usr/lib/gcc/i686-linux-gnu/4.7/include/stdarg.h \
     /usr/include/i386-linux-gnu/bits/stdio_lim.h \
     /usr/include/i386-linux-gnu/bits/sys_errlist.h
    #

    2 、编译阶段(Compiling)

    第二步进行的是编译阶段,在这个阶段中,Gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,Gcc把代码翻译成汇编语言。用户可以使用”-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
     用法:       gcc -S --verbose-asm hello.i  -o hello.s
    作用:将预处理输出文件hello.i汇编成hello.s文件。

    #gcc -S --verbose-asm hello.i -o hello.s
    #ls
    hello.c  hello.i  hello.s
    

    使用vim查看hello.s 文件:

     .file   "hello.c"
    # GNU C (Ubuntu/Linaro 4.7.2-2ubuntu1) version 4.7.2 (i686-linux-gnu)
    #   compiled by GNU C version 4.7.2, GMP version 5.0.2, MPFR version 3.1.0-p3, MPC version 0.9
    # GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
    # 传递的选项:  -fpreprocessed hello.i -mtune=generic -march=i686
    # -auxbase-strip hello.s -fverbose-asm -fstack-protector
    # 启用的选项:  -fasynchronous-unwind-tables -fauto-inc-dec
    # -fbranch-count-reg -fcommon -fdebug-types-section
    # -fdelete-null-pointer-checks -fdwarf2-cfi-asm -fearly-inlining
    # -feliminate-unused-debug-types -ffunction-cse -fgcse-lm -fgnu-runtime
    # -fident -finline-atomics -fira-share-save-slots -fira-share-spill-slots
    # -fivopts -fkeep-static-consts -fleading-underscore -fmath-errno
    # -fmerge-debug-strings -fmove-loop-invariants -fpcc-struct-return
    # -fpeephole -fprefetch-loop-arrays -fsched-critical-path-heuristic
    # -fsched-dep-count-heuristic -fsched-group-heuristic -fsched-interblock
    # -fsched-last-insn-heuristic -fsched-rank-heuristic -fsched-spec
    # -fsched-spec-insn-heuristic -fsched-stalled-insns-dep -fshow-column
    # -fsigned-zeros -fsplit-ivs-in-unroller -fstack-protector
    # -fstrict-volatile-bitfields -ftrapping-math -ftree-cselim -ftree-forwprop
    # -ftree-loop-if-convert -ftree-loop-im -ftree-loop-ivcanon
    # -ftree-loop-optimize -ftree-parallelize-loops= -ftree-phiprop -ftree-pta
    # -ftree-reassoc -ftree-scev-cprop -ftree-slp-vectorize
    # -ftree-vect-loop-version -funit-at-a-time -funwind-tables
    # -fvect-cost-model -fverbose-asm -fzero-initialized-in-bss -m32 -m80387
    # -m96bit-long-double -maccumulate-outgoing-args -malign-stringops
    # -mfancy-math-387 -mfp-ret-in-387 -mglibc -mieee-fp -mno-red-zone
    # -mno-sse4 -mpush-args -msahf -mtls-direct-seg-refs
    
        .section    .rodata
    .LC0:
        .string "Hello World"
        .text
        .globl  main
        .type   main, @function
    main:
    .LFB0:
        .cfi_startproc
        pushl   %ebp    #
        .cfi_def_cfa_offset 8
        .cfi_offset 5, -8
        movl    %esp, %ebp  #,
        .cfi_def_cfa_register 5
        andl    $-16, %esp  #,
        subl    $16, %esp   #,
        movl    $.LC0, (%esp)   #,
        call    puts    #
        movl    $0, %eax    #, D.1815
        leave
        .cfi_restore 5
        .cfi_def_cfa 4, 4
        ret
    

    3 、汇编阶段(Assembling)

    汇编阶段是把编译阶段生成的”.s”文件转成二进制目标代码.
    用法:
            gcc -c hello.s -o hello.o

    作用:将汇编输出文件test.s编译输出test.o文件。

    #ls
    hello.c  hello.i  hello.s
    #gcc -c hello.s -o hello.o
    #ls
    hello.c  hello.i  hello.o  hello.s
    

    使用         file hello.o 查看hello.o文件信息:

    #file hello.o 
    hello.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
    #
    


    我们也可以使用objdump查看hello.o的汇编信息:         objdump -d hello.o

            

    #objdump -d hello.o 
    
    hello.o:     文件格式 elf32-i386
    
    
    Disassembly of section .text:
    
    00000000 <main>:
       0:	55                   	push   %ebp
       1:	89 e5                	mov    %esp,%ebp
       3:	83 e4 f0             	and    $0xfffffff0,%esp
       6:	83 ec 10             	sub    $0x10,%esp
       9:	c7 04 24 00 00 00 00 	movl   $0x0,(%esp)
      10:	e8 fc ff ff ff       	call   11 <main+0x11>
      15:	b8 00 00 00 00       	mov    $0x0,%eax
      1a:	c9                   	leave  
      1b:	c3                   	ret    
    #
    
    这个和我们使用gdb调试时使用disassemble查看是一样的!

    (gdb) disassemble 
    Dump of assembler code for function main:
       0x0804840c <+0>:	push   %ebp
       0x0804840d <+1>:	mov    %esp,%ebp
       0x0804840f <+3>:	and    $0xfffffff0,%esp
       0x08048412 <+6>:	sub    $0x10,%esp
    => 0x08048415 <+9>:	movl   $0x80484c8,(%esp)
       0x0804841c <+16>:	call   0x80482f0 <puts@plt>
       0x08048421 <+21>:	mov    $0x0,%eax
       0x08048426 <+26>:	leave  
       0x08048427 <+27>:	ret    
    End of assembler dump.
    (gdb) 
    

    4 、链接阶段(Link)


    在成功编译之后,就进入了链接阶段。无选项链接。

    用法:gcc -v hello.o -o hello

    作用:将编译输出文件hello.o链接成最终可执行文件hello。

    #gcc -v hello.o  -o hello
    使用内建 specs。
    COLLECT_GCC=gcc
    COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-linux-gnu/4.7/lto-wrapper
    目标:i686-linux-gnu
    配置为:../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.7.2-2ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.7/README.Bugs --enable-languages=c,c++,go,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.7 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.7 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu
    线程模型:posix
    gcc 版本 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) 
    COMPILER_PATH=/usr/lib/gcc/i686-linux-gnu/4.7/:/usr/lib/gcc/i686-linux-gnu/4.7/:/usr/lib/gcc/i686-linux-gnu/:/usr/lib/gcc/i686-linux-gnu/4.7/:/usr/lib/gcc/i686-linux-gnu/
    LIBRARY_PATH=/usr/lib/gcc/i686-linux-gnu/4.7/:/usr/lib/gcc/i686-linux-gnu/4.7/../../../i386-linux-gnu/:/usr/lib/gcc/i686-linux-gnu/4.7/../../../../lib/:/lib/i386-linux-gnu/:/lib/../lib/:/usr/lib/i386-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/i686-linux-gnu/4.7/../../../:/lib/:/usr/lib/
    COLLECT_GCC_OPTIONS='-v' '-o' 'hello' '-mtune=generic' '-march=i686'
     /usr/lib/gcc/i686-linux-gnu/4.7/collect2 --sysroot=/ --build-id --no-add-needed --as-needed --eh-frame-hdr -m elf_i386 --hash-style=gnu -dynamic-linker /lib/ld-linux.so.2 -z relro -o hello /usr/lib/gcc/i686-linux-gnu/4.7/../../../i386-linux-gnu/crt1.o /usr/lib/gcc/i686-linux-gnu/4.7/../../../i386-linux-gnu/crti.o /usr/lib/gcc/i686-linux-gnu/4.7/crtbegin.o -L/usr/lib/gcc/i686-linux-gnu/4.7 -L/usr/lib/gcc/i686-linux-gnu/4.7/../../../i386-linux-gnu -L/usr/lib/gcc/i686-linux-gnu/4.7/../../../../lib -L/lib/i386-linux-gnu -L/lib/../lib -L/usr/lib/i386-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/i686-linux-gnu/4.7/../../.. hello.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i686-linux-gnu/4.7/crtend.o /usr/lib/gcc/i686-linux-gnu/4.7/../../../i386-linux-gnu/crtn.o
    #
    

    我们可以使用  nm hello 查看使用的符号信息

    #nm hello
    0804a020 B __bss_start
    0804a020 b completed.6382
    0804a018 D __data_start
    0804a018 W data_start
    08048350 t deregister_tm_clones
    080483c0 t __do_global_dtors_aux
    08049f0c t __do_global_dtors_aux_fini_array_entry
    0804a01c D __dso_handle
    08049f14 d _DYNAMIC
    0804a020 D _edata
    0804a024 B _end
    080484a8 T _fini
    080484c0 R _fp_hw
    080483e0 t frame_dummy
    08049f08 t __frame_dummy_init_array_entry
    080485c8 r __FRAME_END__
    0804a000 d _GLOBAL_OFFSET_TABLE_
             w __gmon_start__
    080484a2 T __i686.get_pc_thunk.bx
    080482b0 T _init
    08049f0c t __init_array_end
    08049f08 t __init_array_start
    080484c4 R _IO_stdin_used
             w _ITM_deregisterTMCloneTable
             w _ITM_registerTMCloneTable
    08049f10 d __JCR_END__
    08049f10 d __JCR_LIST__
             w _Jv_RegisterClasses
    080484a0 T __libc_csu_fini
    08048430 T __libc_csu_init
             U __libc_start_main@@GLIBC_2.0
    0804840c T main
             U puts@@GLIBC_2.0
    08048380 t register_tm_clones
    08048320 T _start
    0804a020 D __TMC_END__
    #
    




    展开全文
  • gcc编译过程概述.pdf

    2013-03-04 22:52:53
    gcc编译过程概述.pdfgcc编译过程概述.pdf
  • C语言再学习 -- GCC编译过程-附件资源
  • 嵌入式程序设计基础GCC编译过程PPT学习教案.pptx
  • gcc编译过程四步

    2017-03-26 20:49:58
    gcc编译过程四步 步骤 命令 解释 预处理 gcc -o hello.i -E hello.c 插入#include<文件> #define替换等 编译 gcc -o hello.s -S hello.i 生成汇编代码 汇编 gcc -o hello.o -c hello.s 机器语言,二进制...

    gcc编译过程四步

    步骤命令解释
    预处理gcc -o hello.i -E hello.c插入#include<文件> #define替换等
    编译gcc -o hello.s -S hello.i生成汇编代码
    汇编gcc -o hello.o -c hello.s机器语言,二进制文件
    链接gcc -o hello hello.o可执行文件,如标准C库中printf.o链接合并

    大项目编译需makefile,升级版cmake

    gcc编译cpp程序添加 -lstdc++ 参数

    gcc cpp.cpp -lstdc++ 建议直接用g++

    展开全文
  • GCC编译过程,了解编译原理

    千次阅读 2018-12-09 20:00:16
    1、GCC编译过程分解 以HelloWorld程序为例 2、预编译 规则: 命令:gcc -E XXX.c -o XXX.i   3、编译 词法分析、语法分析、语义分析及优化 ---------------&gt;&gt; 汇编代码文件 命令:...

    说明:这篇文件是在读《程序员的自我修养——链接、装载与库》的一点笔记,权当时学习的记录。

    1、GCC编译过程分解

    以HelloWorld程序为例

    2、预编译

    规则:

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

     

    3、编译

    词法分析、语法分析、语义分析及优化 --------------->> 汇编代码文件

    命令:gcc -S XXX.c -o XXX.s

    3.1 编译过程

    6步:扫描、语法分析、语义分析、源代码优化、代码生成和目标代码优化。

    1、词法分析

    源代码程序进入扫描器(scanner),将源代码的字符序列分割成一系列的记号(Token)。并将记号进行分类,如符号表(存放标识符)和文字表(存放数字、字符串常量)等。

    2、语法分析

    语法分析器(Grammer Parser)对记号(Token)进行语法分析,并生成语法树(Syntax Tree)。

    如,array[index] = (index + 4) * (2 + 6) 生成的语法树图。

    3、语义分析

    语义分析器完成对表达式的语法层面的分析。它不知道语句真正含义,是对静态语义的分析。所谓静态语义,是编译期可确定的语义,包括声明、类型匹配和类型转换。对应的动态语义,则是运行期确定的语义。

    语义分析结果,在语法树上标识类型。

    4、中间语言生成

    源代码优化器对源代码进行优化。如将编译期可确定的值进行优化。语法树如下:

    5、目标代码生成与优化

    代码生成器将中间代码转换成目标机器代码,依赖于目标机器。

    目标代码优化器对上面生成的目标代码进行优化(如、寻址方式、位移代替乘法、删除多余的指令等)。

    总结:编译器可以将一个源代码文件编译成一个未链接的目标文件。

    4、汇编

    汇编代码 --------------->> 机器指令

    命令:as XXX.s -o XXX.o 或者 gcc -c XXX.s -o XXX.o

    5、链接

    符号(Symbol),表示一个地址。这个地址可以是一段子程序的起始地址,或是一个变量的起始地址。

    代码按照功能或者性质划分。如语句块、函数、功能模块。变量的访问需要知道目标变量的地址,函数访问需要知道目标函数的地址,这就是模块划分后面临的模块间的通信问题。链接(Linking)将这些模块完美的拼接和组合起来。如下图所示:

    静态链接,把各个模块之间相互引用的部分处理好,使得各模块间能够正确地衔接。包括,地址空间分配、符号决议和重定位等。

    是一些常用代码被编译成目标文件后打包存放。

    展开全文
  • 【Linux】gcc编译过程

    2018-08-21 13:11:30
    gcc编译过程: 在使用gcc编译程序时,编译过程分为4个阶段。 (1)预处理 (2)编译 (3)汇编 (4)链接 Linux程序员可以根据自己的需要让gcc在编译的任何阶段结束,以便检查或使用编译器在该阶段的...
  • gcc编译过程,helloworld举例

    千次阅读 2019-04-15 23:28:04
    gcc编译过程,helloworld举例 编译过程图示: 整个过程可分为四个阶段逐步完成:预处理,编译,汇编,链接 一个C/C++文件要经过预处理(preprocessing)、编译(compilation)、汇编(assembly)、和链接(linking)才能变成...
  • GCC编译过程探索

    2016-02-21 16:06:53
    GCC编译过程 GCC编译程序的四个阶段: 1、 预处理(也称预编译) 2、 编译 3、 汇编 4、 链接   在编译程序的过程,可以加上不同的参数使其在不同阶段停止,以便观察不同阶段的输出信息和输出问文件。...
  • Linux中gcc编译过程分解

    千次阅读 2016-07-07 19:14:06
    GCC编译过程分解 以helloworld为例分析gcc编译过程: #include int main() {  printf(“Hello World\n”);  return 0; } GCC编译过程可以被细分为四个阶段:预处理 编译 汇编 链接 1.预处理 ...
  • Linux系统GCC常用命令和GCC编译过程描述 前言: GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C语言。GCC 很快地扩展,变得可处理 C++。后来又  扩展能够支持更多编程语言,如Fortran、...
  • gcc编译过程及Makefile文件
  • C语言再学习 -- GCC编译过程

    万次阅读 多人点赞 2016-11-25 21:04:42
    参看:GCC编译过程分解 一、GCC简介: gcc的原名叫做GNU C语言 编译器(GNU C Compile),只能编译C语言程序,后来很快就做了扩展,支持了更多的编程语言,比如C+ Object-c ...,改名为GNC 编译器 套件(GNU ...
  • GCC编译过程浅析

    千次阅读 2012-04-27 18:09:40
    GCC编译过程浅析  2012-01-08 17:07:18| 分类: 编程技术 | 标签:linux 编程 学习笔记  |字号 订阅 前几天看了《程序员的自我修养——链接、装载与库》中的第...
  • linux GCC编译过程

    2018-10-17 22:46:47
    典型的编译过程: 预处理 编译及优化 汇编命令: 链接 执行 典型的编译过程: test.c –预处理 —> test.i –编译 —> test.s –汇编 —> test.o –连接 —> test 简单例子: $ cat test.c ...
  • gcc编译过程 编译过程: make && makefile make概述 makefile语法
  • Linux下gcc编译过程及参数介绍

    千次阅读 2019-07-17 18:46:13
    1、gcc编译过程详解:ESc法 2、参数介绍 gcc 常用参数: 1、-I : 用于指定头文件存放路径 如:gcc main.cpp -I ./include 2、-D : 在执行命令的时候,在外部指定宏 如:gcc main.cpp -D DEBUG ...
  • gcc编译过程 我们知道gcc是一个强大的编译器,很多Linux下的GNU工具都是用C语言写的,并且用gcc编译的,那么gcc的编译过程是怎样的呢,先来看一个总的流程图,我自己简单画的,凑合着看 1首先是源文件经过预加载...
  • 什么是GCC? GCC编译过程

    千次阅读 2018-11-23 23:19:25
    其实一开始的确是这样的,GCC 原名为GUN C 语言编译器( GNU C Compiler), 原本只能处理编译C语言。 但是后来GCC发展壮大了,可以编译C++, Fortran,Pascal,Objective-C, Java,Ada,Go以及各类处理器构架上的汇编语言...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 160,069
精华内容 64,027
关键字:

gcc编译过程