精华内容
下载资源
问答
  • GCC分步编译C++程序

    2020-07-17 20:17:24
    在此基础上,本节将对“如何分步编译C/C++程序”这个问题做一个完整的解答。 接下来,我将以 g++ 指令分别对 C++ 源程序做预处理、编译、汇编和链接操作为例,完整地给读者演示如何分步编译源代码程序。样例程序如下...

    通过前面几节的讲解,已经就 gcc(g++)指令可用的 -E、-S、-c 以及 -o 选项的功能和用法做了详细的讲解。在此基础上,本节将对“如何分步编译C/C++程序”这个问题做一个完整的解答。

    接下来,我将以 g++ 指令分别对 C++ 源程序做预处理、编译、汇编和链接操作为例,完整地给读者演示如何分步编译源代码程序。样例程序如下:

     
    1. //位于 demo.cpp 文件中
    2. #include <iostream>
    3. using namespace std;
    4.  
    5. int main(){
    6. cout << "GCC教程:http://c.biancheng.net/gcc/" << endl;
    7. return 0;
    8. }

    GCC分步编译C++源程序

    1) 预处理

    通过给 g++ 指令添加 -E 选项,即可轻松实现令 GCC 编译器只对目标源程序进行预处理操作。比如:

    [root@bogon demo]# g++ -E demo.cpp -o demo.i
    [root@bogon demo]# ls
    demo.cpp  demo.i

    注意,由于编译阶段需要用到预处理的结果,因此这里必须使用 -o 选项将该结果输出到指定的 demo.i 文件中(Linux 系统中,通常用 ".i" 或者 ".ii" 作为 C++ 程序预处理后所得文件的后缀名)。

    感兴趣的读者可自行运行 cat demo.i 指令查看 demo.i 文件中的内容。

    2) 编译 

    值得一提的是,编译阶段针对的将不再是 demo.cpp 源文件,而是 demo.i 预处理文件。对预处理文件进行编译操作,实际上就是对 demo.i 文件做进一步的语法分析,并生成对应的汇编代码文件(Linux 发行版通常以 ".s" 作为其后缀名)。

    通过给 g++ 指令添加 -S 选项,即可令 GCC 编译器仅对指定预处理文件做编译操作。例如:

    [root@bogon demo]# g++ -S demo.i
    [root@bogon demo]# ls
    demo.cpp  demo.i  demo.s

    和预处理阶段不同,即便这里不使用 -o 选项,编译结果也会输出到和预处理文件同名(后缀名改为 .s)的新建文件中。

    3) 汇编

    汇编阶段就是将之前生成的汇编代码文件(demo.s)做进一步转换,生成对应的机器指令。通过给 g++ 指令添加 -c 选项,即可令 GCC 编译器仅对指定的汇编代码文件做汇编操作。

    例如:

    [root@bogon demo]# g++ -c demo.s
    [root@bogon demo]# ls
    demo.cpp  demo.i  demo.o  demo.s

    显然,默认情况下汇编操作会自动生成一个和汇编代码文件名称相同、后缀名为 .o 的二进制文件(又称为目标文件)。

    4) 链接

    目标文件已经是二进制文件,与可执行文件的组织形式类似,只是有些函数和全局变量的地址还未找到,因此还无法执行。链接的作用就是找到这些目标地址,将所有的目标文件组织成一个可以执行的二进制文件。

    完成链接操作,并不需要给 g++ 添加任何选项,只要将汇编阶段得到的 demo.o 作为参数传递给它,g++就会在其基础上完成链接操作。例如:

    [root@bogon demo]# g++ demo.o
    [root@bogon demo]# ls
    a.out  demo.cpp  demo.i  demo.o  demo.s

    在链接阶段,如果不使用 -o 选项将执行结果输出到指定文件,则 g++ 会默认创建一个名为 a.out 的可执行文件,并将执行结果输出到该文件中。

    经过以上 4 步,最终生成了 a.out 可执行文件,我们可以尝试运行该文件,查看其结果是否正确:

    [root@bogon demo]# ./a.out
    GCC教程:http://c.biancheng.net/gcc/

    显然,该结果和我们的预期相符。

    除此之外,如果读者不想执行这么多条指令,但想获得预处理、编译、汇编以及链接这 4 个过程产生的中间文件,可以执行如下指令:

    [root@bogon demo]# g++ demo.cpp -save-temps
    [root@bogon demo]# ls
    a.out  demo.c  demo.cpp  demo.ii  demo.o  demo.s

    可以看到,通过给 g++ 添加 -save-temps 选项,可以使 GCC 编译器保留编译源文件过程中产生的所有中间文件。

    展开全文
  • 博客地址:http://blog.csdn.net/u012319379/article/details/77816782上一篇分析了[分步编译之uboot编译03 ] (http://blog.csdn.net/u012319379/article/details/77816782),这一篇分析下内核编译。脚本分析 build_...

    作者: Linux-小企鹅
    博客地址:http://blog.csdn.net/u012319379/article/details/77822167

    上一篇分析了[分步编译之uboot编译03 ] (http://blog.csdn.net/u012319379/article/details/77816782),这一篇分析下内核编译。

    脚本分析

    • build_kernel函数分析
    function build_kernel()
    {
        if [ ${BUILD_ALL} == "true" ] || [ ${BUILD_KERNEL} == "true" ]; then
            echo ""
            echo "=============================================="
            echo "build kernel"
            echo "=============================================="
    
            if [ ! -e ${TOP}/kernel ]; then
                cd ${TOP}
                ln -s linux/kernel/kernel-3.4.39 kernel
            fi
    
            cd ${TOP}/kernel
        #根据ANDROID_VERSION_MAJOR变量的值选择配置文件
            local kernel_config=
            if [ ${ANDROID_VERSION_MAJOR} == "4" ]; then
                kernel_config=${CHIP_NAME}_${BOARD_PURE_NAME}_android_defconfig
            elif [ ${ANDROID_VERSION_MAJOR} == "5" ]; then
                kernel_config=${CHIP_NAME}_${BOARD_PURE_NAME}_android_lollipop_defconfig
            else
                echo "ANDROID_VERSION_MAJOR is abnormal!!! ==> ${ANDROID_VERSION_MAJOR}"
                exit 1
            fi
    
            if [ ${ROOT_DEVICE_TYPE} == "nand" ]; then
                kernel_config=$(apply_kernel_nand_config)
                echo "nand kernel config: ${kernel_config}"
            fi
    
            #make distclean
    
            #cp arch/arm/configs/${kernel_config} .config
        #cp arch/arm/configs/iTOP6818_android_defconfig .config
    
        #这句我也看不懂,感觉像是根据oldconfig配置内核,后面也贴出来了,看懂的朋友回复下,呵呵。
            yes "" | make ARCH=arm oldconfig
            make ARCH=arm uImage -j8
    
        #make ARCH=arm modules
    
            if [ ${ROOT_DEVICE_TYPE} == "nand" ]; then
                rm -f ${TOP}/arch/arm/configs/${kernel_config}
            fi
    
            check_result "build-kernel"
    
            echo "---------- End of build kernel"
        fi
    }
    
    #主要是:
    1. yes "" | make ARCH=arm oldconfig
    2. make ARCH=arm uImage -j8

    yes “” | make ARCH=arm oldconfig 这句我也看不懂

    • 看的懂的人帮忙回复一下。这句话在build_kernel函数里面。
    展开全文
  • 一、 以下是C程序一般的编译过程: 从图中看到: 将编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译阶段 和链接这两个阶段。 其中, 1. 编译阶段先通过“编译器...

    一、 以下是C程序一般的编译过程:

     

     

     从图中看到:

          将编写的一个c程序(源代码 )转换成可以在硬件上运行的程序(可执行代码 ),需要进行编译阶段  和链接这两个阶段。

          其中,

          1.  编译阶段先通过“编译器 “把一个 .c / .cpp 源代码 编译成 .s的汇编代码 ;再经过“汇编器 ” 把这 个.s的汇编代码汇编成 .o 的 目标代码

          2.  “连接器 “ 通过连接其他 .o 代码(如果需要的话) 库文件 和 1 中的.o 目标代码生成可执行文件

    该文件流被这三种程序(红色)的加工,分别表现出四种形式(蓝色) ,这就是c程序的编译和链接过程。如果再详细的话,编译器在将源文件编译成汇编文件的过程又分为:预处理阶段(生成 .i代码) 和  优化阶段

     

     

    二、C编程中的文件后缀名介绍

        .c 未经过预处理的C源码

        .h C头文件  

        .i 经过预处理的C源码          加入头文件内容

        .s 生成的汇编语言代码           文本格式的 低级机器语言指令

        .o 编译之后产生的目标文件      二进制文件
        解释:*.c一般使我们自己编辑的代码,使我们劳动的结晶;

    *.h一般是我们手工生成的接口文件,如果愿意,也可在*.c完成后用GCC的选项-aux-info帮我们生成;

    *.i是经过预处理后的源码,是由GCC在选项-E编译下自动生成的文件;

    *.o是编译后产生的目标文件;

    *.s是GCC在选项-S编译下生成的汇编语言代码,对于性能要求很高的程序可以先生成汇编语言文件并对汇编做优化,然后用优化后的汇编生成目标文件并链接

     

     

    三 演示 hello.c 的编译 过程(Linux 下 Gcc)

        

             本小节的演示都针对文件 hello.c 进行

       1. /*
       2.  * hello.c
       3.  */
       4.
       5.   #include <stdio.h>
       6.   int  main()
       7.   {
       8.     printf(" Better goal, Better life! /n");
       9.     return 0;
      10.   }

     

      1.生成预处理后的文件 hello.i

         $ gcc -E hello.c -o hello.i

      2 .生成汇编语言文件 hello.s

          $ gcc -s hello.i -o hello.s

       3.生成目标文件 hello.o

          $ gcc -c hello.i
          $ gcc -c hello.s

       4. 生成可执行文件

          $ gcc -o hello hello.o

       5. 运行及结果

          $ ./hello

          HelloWorld

     

    当然也可以直接生成, $ gcc -c hello.c  就可以生成可执行文件

    转载于:https://www.cnblogs.com/maxiaodoubao/p/4748102.html

    展开全文
  • Linux 交叉编译工具链

    2021-04-15 17:36:24
    平台:CPU-PLATFORM-OS,举例:arm-linux-gnu. 本地编译:平台编译出来的...1.分步编译工具链需要的库和工具(对原始码进行编译)。 2.使用第三方工具编译生成交叉工具链。 3.下载已制作好好的交叉编译工具链。 ...

    平台:CPU-PLATFORM-OS, eg:arm-linux-gnu.
    本地编译:平台编译出来的代码运行在当前平台。
    交叉编译:一种平台上编译出来的代码运行在另一种平台。
    交叉编译工具链组成:交叉编译工具链主要由binutils、gcc和glibc 3个部分组成。

    获取工具链来源:
    1.分步编译工具链需要的库和工具(对原始码进行编译)。
    2.使用第三方工具编译生成交叉工具链。
    3.下载已制作好好的交叉编译工具链。

    展开全文
  • linux编译c++

    2020-04-09 10:13:44
    一、GCC(GNU Compiler Collection)是Linux下最主要的编译工具,GCC不仅功能非常强大,结构也异常灵活。它可以通过不同的前端模块来支持各种语言,如Java、Fortran、Pascal、Modula-3和Ada g++是GCC中的一个工具,...
  • 作者: Linux-小企鹅 博客地址:http://blog.csdn.net/u012319379/article/details/77822167脚本分析function build_module() { if [ ${BUILD_ALL} == "true" ] || [ ${BUILD_MODULE} == "true" ]; then echo "
  • 一,编译器和编辑器的区别 编辑器:即编写代码的工具,方便人对程序的操作和管理如窗口系统中的记事本...二.gcc分步编译 预处理:宏定义展开,头文件展开,条件编译,删除注释在这里并不会做任何语法的检查.gcc...
  • 作者: Linux-小企鹅 博客地址:http://blog.csdn.net/u012319379/article/details/77816782上一篇分析了 http://blog.csdn.net/u012319379/article/details/77803806,这是一个简化操作流程的脚本,降低操作难度,...
  • gcc分步编译   1、编写简单例子 #include int main(void) { printf("Hello!\n"); return 0; }   2、预处理生成hello.i eastmoon@eastmoon-virtual-machine:~/work/guoqian/1/1.2$gcc -E hello.c ...
  • linux编译C++程序

    千次阅读 2017-07-19 10:23:43
    一、GCC(GNU Compiler Collection)是Linux下最主要的编译工具,GCC不仅功能非常强大,结构也异常灵活。它可以通过不同的前端模块来支持各种语言,如Java、Fortran、Pascal、Modula-3和Ada g++是GCC中的一个工具,...
  • linux编译C

    2015-09-27 09:50:49
    市面上常见的Linux都是发行版本,典型的Linux发行版包含了Linux内核、桌面环境和各种常用的必备工具,国内使用较多的是Ubuntu(乌班图)、CentOS、Deepin(深度Linux)。本教程以Deepin为例来讲述如何编译C程序。 ...
  • arm-Linux交叉编译

    万次阅读 2017-04-19 21:14:01
    平常我们做的编译叫本地编译,也就是在当前平台编译编译得到的程序也是爱本地执行。...在linux pc 上,利用arm-linux-gcc编译器,编译出正对linux arm品台的可执行代码。 在windows pc上,利用cygwin
  • 作者: Linux-小企鹅 博客地址:http://blog.csdn.net/u012319379/article/details/77816782脚本分析 build_android函数分析 function build_android() { if [ ${BUILD_ALL} == "true" ] || [ ${BUILD_ANDROID} ==...
  • Linux 内核编译 添加系统调用

    千次阅读 2013-04-15 11:19:18
    主机:Ubuntu 11.04 现在内核版本:2.6.38.9 ...1、从下载Linux内核版本2.6.39 2、解压内核到任意目录(这里不用必须解压到/usr/src/下,Linus也说不必那样做,况且自己也试验成功) 3、进入内核目录
  • 市面上常见的Linux都是发行版本,典型的Linux发行版包含了Linux内核、桌面环境和各种常用的必备工具,国内使用较多的是Ubuntu(乌班图)、CentOS、Deepin(深度Linux)。本教程以Deepin为例来讲述如何编译C程序。...
  • 构建ARM Linux交叉编译工具链--Crosstool

    千次阅读 2009-12-01 22:56:00
    构建ARM Linux交叉编译工具链--Crosstool 在同一个体系平台上开发程序属于本地编译,在不同的体系平台上开发其他平台的程序,这时就需要利用交叉编译...方法一 分步编译和安装交叉编译工具链所需要的库和源代码,最终
  • 构建ARM Linux交叉编译工具链 详解

    千次阅读 2009-11-06 09:17:00
    构建ARM Linux交叉编译工具链 详解 本章学习目标: ● 了解交叉编译工具链 ● 理解分步构建交叉编译工具链的方法 ● 学会使用Crosstool工具构建交叉编译工具链2.1 交叉编译工具链介绍读者可能会有疑问,为什么要...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,144
精华内容 857
关键字:

linux分步编译

linux 订阅