zoukankan      html  css  js  c++  java
  • Linux中编译C文件

    C/C++程序编译的过程

    预处理,展开头文件,宏定义,条件编译处理等。通过gcc -E source.c -o source.i或者cpp source.c生成。

    编译。这里是一个狭义的编译意义,指的是将预处理后的文件翻译成汇编代码的过程。通过gcc -S source.i生成。默认生成source.s文件。

    汇编。汇编即将上一步生成的汇编代码翻译成对应的二进制机器码的过程。通过gcc -c source.s来生成source.o文件。

    链接。链接是将生成目标文件和其引用的各种符号等生成一个完整的可执行程序的过程。链接的时候会进行虚拟内存的重定向操作。

    上面四个步骤就是C/C++程序编译的几个基本步骤。前面三个步骤都是很简单,大多时候会合并为一个步骤。只有第四个步骤链接是复杂一点的。

    C/C++程序编译方式及生成指定文件

    .o文件,即目标文件。一般通过.c或者.cpp文件编译而来,相当于VC编译出来的obj文件。

    .a文件,archive 归档包,即静态库。其实质是多个.o文件打包的结果,相当于VC下的.lib文件。

    .so文件,shared object 共享库(对象),相当于windows下的dll。

    (1) 编译单个文件[.o]

    $gcc file.c            #这是最简单形式,缺省输出为a.out
    $./a.out               #执行
    $gcc file.c -o file.o  #生成指定的可执行文件
    $./file.o              #执行

    (2) 编写及使用静态库[.a](背景:main.c使用了sub.c中的函数,sub.c -> sub.o -> libsub.a)

    $gcc -c sub.c                    #-c:只编译不链接
    $ar -rsv libsub.a sub.o          #链接静态库
    $gcc main.c -L./ -lsub -o main.o #main.c:主函数 -L:库文件路径 -l:后面接库文件名,全名为libsub.a
    $./main.o                        #执行

    (3) 编写及使用动态库[.so](背景:main.c使用了sub.c中的函数,sub.c -> libsub.so)

    $gcc -fpic -shared -o libsub.so sub.c #-shared:指定生成动态连接库 -fpic:编译为位置独立的代码
    $gcc main.c -o main.o ./libsub.so
    $./main.o                             #执行
  • 相关阅读:
    大臣的旅费 Apare_xzc 求树的直径 蓝桥杯
    连号区间数 Apare_xzc
    js盒模型
    js仿真进度条
    JS卷动事件
    json对象读取
    button属性及兼容性处理
    js图片跟随效果
    商城倒计时JS怎么做
    计算某天距离现在日期的差值
  • 原文地址:https://www.cnblogs.com/storml/p/7736506.html
Copyright © 2011-2022 走看看