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                             #执行
  • 相关阅读:
    23种设计模式(转载)
    RabbitMQ JAVA客户端调用
    JavaScript中的this
    RedisDesktopManager 踩坑之旅
    webmagic使用手册
    Maven 手动添加本地jar包
    根据端口号查询 进程 并杀掉进程
    从经典面试题看java中类的加载机制
    Java线程的5种状态及切换(透彻讲解)
    JVM 类加载机制详解
  • 原文地址:https://www.cnblogs.com/storml/p/7736506.html
Copyright © 2011-2022 走看看