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                             #执行
  • 相关阅读:
    机器学习中的正则化问题(2)——理解正则化
    详解 Python 中的下划线命名规则
    编程面试的算法概念汇总
    group by多字段查询解决礼物统计
    一分钟学会Spring Boot多环境配置切换
    Maven 多模块父子工程 (含Spring Boot示例)
    第1章 Spring Cloud 构建微服务架构(一)服务注册与发现
    第3章 Spring Boot 入门指南
    第5章 Spring Boot 功能
    第4章 CentOS软件安装
  • 原文地址:https://www.cnblogs.com/storml/p/7736506.html
Copyright © 2011-2022 走看看