编译多个源代码文件会生成多个目标文件,每个目标文件都包含一个源文件的机器码和相关数据的符号表。除非使用-c选项指示 GCC 只编译不链接,否则 GCC 会使用临时文件作为目标文件输出:

$ gcc -c main.c
$ gcc -c func.c

这些命令会在当前目录中生成两个目标文件,分别是 main.o 和 func.o。把两个源文件名放在同一个 GCC 命令中,也可以获得同样的结果:

$ gcc -c main.c func.c

然而,实际上编译器通常每次只会被调用来完成一件小型任务。大的程序包含许多源文件,在开发期间必须被编译、测试、编辑,然后再编译,很少会有在创建中的修改行为会影响所有的源文件。为了节省时间,可以使用
make 控制创建过程,由它调用编译器重新编译,而且只编译比对应的最新源文件旧的那些目标文件。

一旦所有当前源文件都被编译为目标文件,就可以使用 GCC 来链接它们:

$ gcc main.o func.o -o app.out -lm

GCC 假设扩展名为.o的文件是要被链接的目标文件。

文件类型

编译器支持许多和C语言程序相关的扩展名,对它们的说明如下:

扩展名(后缀) 说明
.c C程序源代码,在编译之前要先进行预处理。
.i C程序预处理输出,可以被编译。
.h C程序头文件。(为了节省时间,许多源文件会包含相同的头文件,GCC 允许事先编译好头文件,称为“预编译头文件”,它合适情况下自动被用于编译。)
.s 汇编语言
.S 有C命令的汇编语言,在汇编之前必须先进行预处理。

GCC 也支持以下扩展名:.ii、.cc、.cp、.cxx、.cpp、.CPP、.c++、.C、.hh、.H、.m、.mi、.f、.for、.FOR、.F、.fpp、.FPP、.r、.ads 和 .adb。这些文件类型涉及 C++、Objective-C、Fortran 或 Ada 等程序的编译。使用其他扩展名的文件会被视为对象文件,以作为链接之用。

如果使用其他命名惯例为输入文件命名,可以使用-x file_type选项来指示 GCC 应该如何对待这些文件。file_type 必须是下面其中之一:c、c-header、cpp-output、assembler(表示该文件包含汇编语言)、assembler-with-cpp 或 none。

在命令行中,-x后面所列的所有文件都会被视为所指定的类型。如果想改变类型,可以再次使用-x。如下例所示:

$ gcc -o bigprg mainpart.c -x assembler trickypart.asm -x c otherpart.c

可以在同一个命令行中多次使用-x选项,以指示不同类型的文件。-x none选项会全部取消这些指示,后续文件会按照 GCC 默认规则解释它们的扩展名。

混合输入类型

可以在 GCC 命令行中混合使用其他输入文件类型。如果编译器不能按照请求处理指定的文件,那么它会忽略它们。如下例所示:

$ gcc main.c func.o -o app.out -lm

借助于这个命令,假设指定的文件都存在,GCC 会编译和汇编 main.c,汇编 func.o,并且链接库文件 libm.a。

GCC编译和链接多个文件(包括源文件、目标文件、汇编文件等)的更多相关文章

  1. GCC编译和链接过程

    GCC(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器.它是以GPL许可证所发行的自由软件,也是 GNU计划的关键部分.GCC原本作为GNU操作 ...

  2. gcc编译动态和静态链接库

    我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为静态库和动态库两种.静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库在程序编译时并不会被连接到目标代码中,而是 ...

  3. GCC编译动态和静态链接库例子

    我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为静态库和动态库两种.静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库在程序编译时并不会被连接到目标代码中,而是 ...

  4. 关于如何将C语言源文件转化为汇编文件

    --转载自:http://blog.21ic.com/user1/6088/archives/2010/68469.html 方法:(假设当前工程中只有一个C代码文件) 第1步:新建一个工程,添加C文 ...

  5. gcc 编译和链接

    1.现在对两个文件生成可执行文件 //thanks.c #include <stdio.h> int main(void) { printf("Hello World\n&quo ...

  6. C++常见gcc编译链接错误解决方法

    除非明确说明,本文内容仅针对x86/x86_64的Linux开发环境,有朋友说baidu不到,开个贴记录一下(加粗字体是关键词): 用“-Wl,-Bstatic”指定链接静态库,使用“-Wl,-Bdy ...

  7. 窥探C语言程序的编译、链接与.h文件

    概述 C语言程序从源文件经过编译.链接生成可执行文件.那么编译与链接分别做了什么? 开发中为什么使用.h编写函数的声明?接下来使用案例说清楚为什么这样编写代码. C语言程序的编译和链接 C语言程序从源 ...

  8. GCC的使用(编译,链接,运行)

    以下这三篇日志非常的好,真的非常的好.介绍使用gcc编译,链接,运行c程序. 1.http://lveyo.iteye.com/blog/240578 2.http://lveyo.iteye.com ...

  9. linux下使用gcc编译运行C程序

    gcc(GNU Compiler Collection)是Linux下最常用的C语言编译器,是GNU项目中符合ANSI C标准的编译系统,能够编译用C.C++和Object C等语言编写的程序.  在 ...

随机推荐

  1. QThread创建多线程程序

    最近在阅读Qt 5.9 C++开发指南,为了加深对书本上内容的理解,参照书上的讲解尝试写了一些demo,用于以后工作中查阅,如果涉及侵权请告知,实例程序samp13_1 mythread.h #ifn ...

  2. Java生鲜电商平台-如何使用微服务来架构生鲜电商B2B2C平台?

    Java生鲜电商平台-如何使用微服务来架构生鲜电商B2B2C平台? 说明:随着互联网的日益普及,人们通过手机下单买菜的人越来越多,生鲜这个行业有两个显著的特点,一个是刚需.(你每天都要吃饭,都要吃菜) ...

  3. leetcode406 ,131,1091 python

    LeetCode 406. Queue Reconstruction by Height 解题报告题目描述Suppose you have a random list of people standi ...

  4. 快速幂(51Nod1046 A^B Mod C)

    快速幂也是比较常用的,原理在下面用代码解释,我们先看题. 51Nod1046 A^B Mod C 给出3个正整数A B C,求A^B Mod C. 例如,3 5 8,3^5 Mod 8 = 3. In ...

  5. Maven - Eclipse例子

    版权所有,未经授权,禁止转载 章节 Maven – 简介 Maven – 工作原理 Maven – Repository(存储库) Maven – pom.xml 文件 Maven – 依赖管理 Ma ...

  6. idea以yarn-client 提交任务到yarn

    鉴于很多小白经常问我如何用idea提交任务到yarn,这样测试的时候不用频繁打包. 昨天,晚上健身回来录了一个小视频,说是小视频但是耗时也比较长,将近40min.可能是健身脱水太多,忘了补充盐分,无力 ...

  7. web网页外部分享到微信、朋友圈、扣扣、微博等功能、自动生成二维码等

    1.这里重中之重是分享到微信:web端网页通常是没有权限分享过去的 所以用: weixin://dl/business/?ticket=ta428dhj739hg3efe6e  但是这个ticket真 ...

  8. one_day_one_linuxCmd---crontab 命令

    <坚持每天学习一个 linux 命令,今天我们来学习 tar 命令> 摘要:crond 是 linux 下用来周期性的执行某种任务或等待处理事件的一个守护进程,周期执行的任务一般由 cro ...

  9. Maven:A cycle was detected in the build path of project 'xxx'. The cycle consists of projects {xx}

    以下这个错误是在Eclipse中导入多个相互依赖的工程时出现的“循环依赖问题”:A cycle was detected in the build path of project 'xxx'. The ...

  10. 2020牛客寒假算法基础集训营4 H坐火车

    题目描述 牛牛是一名喜欢旅游的同学,在来到渡渡鸟王国时,坐上了颜色多样的火车. 牛牛同学在车上,车上有 n 个车厢,每一个车厢有一种颜色. 他想知道对于每一个正整数 $ x \in [1,\ n] $ ...