1、#include <>与#include ""的区别

  #include <>只在标准库中搜索头文件,而#include ""首先在用户工作目录(指的是当前被编译源文件所在目录)搜索,搜索不到再到标准库中搜索头文件(注意其他目录是不会搜索的)。也就是说#include ""搜索的范围比#include <>更大,但是#include <>虽然搜索范围小,但却可以节省搜索的时间。

  当我们不使用系统标准库文件,而使用自定义的库文件,这时这个自定义的文件夹(是头文件的文件夹)就替换了系统标准库,成为#include <>搜索的目录。

一个测试例子:

  假设目录test下有文件test.c 、test.h 和两个文件夹include 、lib。其中,test.c和test.h是用户程序,而include、lib是用户自定义的标准库头文件夹和源文件夹。test.c内容有这一句“#include "test.h"”,然后我们让其编译正常。这时再把test.h放到include中,我们会发现仍然编译正常。

  我们再修改test.c中这句话变成“#include <test.h>”,我们会发现仍然编译正常(这时test.h在include文件夹下)。  我们把test.h再重新放回test目录中,这时再编译就会提示找不到头文件test.h。

通过这个实验,我们就会发现我一开始说的结论。

另外,还有一种常见的格式,以一个例子说明。

  #include <mcu/asm.h>,这种情况只会搜索标准库目录(include)中mcu目录,其他目录不会搜索,包括标准库目录,也就是说这种情况只会搜索标准库目录的子目录。

  #include "mcu/asm.h",这种情况不仅要搜索标准库目录(inlcude)的子目录mcu,还要搜索用户目录的子目录mcu,而且是首先从用户目录的子目录mcu搜索。

2、文件在编译过程中只需要函数被声明,而不需要它完全被定义

一个例子:main.c内容

#include "XX.h"
int main()
{   
   wait(); 
   other_function(); 
   while ();
   return ;
}  

XX.h内容:

extern other_function(void);

说明:我们在其他源文件(.c)中定义了other_function()函数的原型,但是并没有定义wait()函数的原型。

测试:我们编译会发现会出现警告信息,说“找不到wait()函数的声明”,但是也能通过编译。

修改:XX.h

extern other_function(void);
extern wait(void);

测试:这时,我们再编译就会发现,连警告信息都没有了。

说明:显然两种情况都没有定义wait()函数的原型,所以在程序连接的时候会报错“找不到wait标号”。

     当然,如果在其他文件中定义了wait()函数,就能连接成功。

我的目的:我试图在找寻编译过程中,各个环节都是怎样工作的。

3、编译和链接做什么样的工作

  试想编译过程中就不考虑函数是否被定义,而只要声明了就能无警告信息的通过编译。说明编译过程中,主要是对本源文件(.c)中程序进行编译,而对于

外部调用的函数,实际上是链接步骤才考虑的事。

   需要说明的是,一个源文件(.c 、.S)经过编译后代码基本上已经确定,位置无关代码就是经过链接步骤也不会改变,位置有关代码才是链接器解决的问题。

  链接步骤,主要完成外部函数的相互链接,我认为是填写偏移量,或者编译地址。当然,还有全局变量的链接。

  链接步骤,会根据文件的lds文件链接程序。将每个文件的各个段按照lds文件的规定排放起来(这里我们不考虑加载地址),然后再根据外部函数的标号查找各个段,然后确定位置有关代码。当然,倘若在这里边没有定义一个段,但是却声明并使用了一个段,显然链接的时候会出现“找不到段”的错误。

  可以说,头文件主要就是外部接口的描述,把需要共享(外部调用)的段声明出来。我认为头文件在链接步骤中已经没有任何作用。 

arm-linux-gcc编译器测试的更多相关文章

  1. Ubuntu12.4 64位 安装 arm linux gcc 4.3.2

    一.下载arm linux gcc 4.3.2 http://pan.baidu.com/share/link?shareid=1575352696&uk=2754759285&fid ...

  2. <转载>linux gcc编译器中使用gdb单步调试程序,程序不是顺序执行的。

    原文地址http://blog.csdn.net/abc78400123/article/details/6779108 在用gdb调试,使用s 或n单步执行程序时,发现程序不是按顺序运行的,有时莫名 ...

  3. Linux gcc编译器

    GNU CC(通常称为GCC)是GNU项目的编译器,他能够编译C.C++语言编写的程序. 使用gcc,程序员可以对编译过程有更多控制,编译过程分为3个阶段. --预处理 --汇编 --链接 程序员可以 ...

  4. 在Ubuntu下安装gcc编译器+测试

    1.输入命令: sudo apt-get install gcc libc6-dev 2.创建文件hello.c使用命令: touch hello.c 3.在hello.c中写入:  #include ...

  5. Linux系统(本例以Ubuntu18.04为例)安装GCC编译器

    Linux(本例以Ubuntu18.04为例)安装GCC编译器 一.安装 安装命令:sudo apt-get  build-dep  gcc 遇到 您希望继续执行吗? [Y/n] y 直接输入y回车即 ...

  6. Linux安装gcc编译器详解

    本人使用的是CentOS 6.5 64位系统,由于在安装系统的时候并没有勾选安装gcc编译器,因此需要自行安装gcc编译器. 使用yum安装gcc 对于配备了yum的Linux发行版而言,安装gcc编 ...

  7. Linux环境下的GCC编译器与GDB调试工具介绍

    假如现在我们有如下代码需要编译运行和调试.文件名为:test.c #include <stdio.h> int main() { int day, month, year, sum, le ...

  8. linux gcc 区分32位或64位编译 && 请问arm存储,是以小端格式还是以大端格式?

    linux gcc 区分32位或64位编译   Linux系统下程序如何区分是64位系统还是32位系统 经过对include的翻查,最后确定gcc以__i386__来 进行32位编码,而以__x86_ ...

  9. linux应用之gcc编译器的安装及使用

    gcc是linux系统下功能十分强大的编译器. 本人使用的是CentOS 6.6 64位系统,由于在安装系统的时候并没有勾选安装gcc编译器,因此需要自行安装gcc编译器. 使用yum安装gcc 对于 ...

  10. Linux下GCC编译器的安装

    通过apt-get方式下载的Qt5.9的gcc编译器版本只是4.8.3,无法打开一些Qt5的库头文件,所以准备在Llinux下再安装一个gcc5.3.0. 查看gcc版本 ubuntu下查看gcc的版 ...

随机推荐

  1. hi3531的h264压缩中改动波特率

    typedef struct hiVENC_ATTR_H264_CBR_S { HI_U32 u32Gop; HI_U32 u32StatTime; HI_U32 u32ViFrmRate; HI_F ...

  2. Tsar 服务器系统和应用信息的采集报告工具

    Tsar介绍 Tsar是淘宝的一个用来收集服务器系统和应用信息的采集报告工具,如收集服务器的系统信息(cpu,mem等),以及应用数据(nginx.swift等),收集到的数据存储在服务器磁盘上,可以 ...

  3. QVariant与自定义数据类型转换的方法

      在使用VC.Delphi编写用户界面程序的时候,经常会把对象与控件的data域进行绑定,便于程序运行中读写提高效率.然而在Qt编程中怎么实现这个功能呢?比如将一个用户自定义的结构体与QComboB ...

  4. 设置background属性使用selector的时候内置?attr报错的解决方案

    当我们设置background属性的时候可以设置background="@color/black" 也可以设置 background="@drawable/selecto ...

  5. mysql配置优化

    [笔记]MySQL 配置优化   安装MySQL后,配置文件my.cnf在 /MySQL安装目录/share/mysql目录中,该目录中还包含多个配置文件可供参考,有my-large.cnf ,my- ...

  6. c语言,strcat(),字符串拼接

    #include<stdio.h> #include<string.h> int main() {  char destination[25];  char  *zhang=& ...

  7. String类概述

    (1)多个字符组成的一串数据.        其实它可以和字符数组进行相互转换.    (2)构造方法:        A:public String()        B:public String ...

  8. 并行计算vs分布式计算

    一般认为,集中在同一个机柜内或同一个地点的紧密耦合多处理机系统或大规模并行处理系统是并行处理系统,而用局域网或广域网连接的计算机系统是分布式处理系统.松散耦合并行计算机中的并行操作系统有时也称为分布式 ...

  9. Servlet单实例多线程模式

    http://kakajw.iteye.com/blog/920839 前言:Servlet/JSP技术和ASP.PHP等相比,由于其多线程运行而具有很高的执行效率.由于Servlet/JSP默认是以 ...

  10. C#学习笔记(3)

    先理解一下方法重写和方法重载这2个概念: 1.方法重写(override):发生在父子类之间,子类重写父类中的方法,关键字是override. 2.方法重载(overload):一个类中有多个重名的方 ...