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. play wav sound

    播放 WAV文件             string s = @"D:\Administrator\安装文件\完美世界国际版\patcher\skin\sounds\click.wav&q ...

  2. MediaProvider 数据库Audio相关表格相应关系

    Android的MediaProvider提供了一系列的Audio,Video,image等表格,用于APP检索相关的音视频图片信息. 首先来看看Audio相关的表格: ×图中颜色同样的部分表示来自于 ...

  3. jfinal-QuartzPlugin后台任务调度

    配置方法: 1. 在jfinal的Start.java中插件位置配置QuartzPlugin /** * 配置插件 */ public void configPlugin(Plugins me) { ...

  4. [HTTPS] MAN IN THE MIDDLE (MITM)

    If you go a public caffee shop, they have free wifi. How could you make sure your infomration cannot ...

  5. UDID

    大多数应用都会用到苹果设备的UDID号,UDID通常有以下两种用途: 1)用于一些统计与分析目的:[第三方统计工具如友盟,广告商如ADMOB等] 2)将UDID作为用户ID来唯一识别用户,省去用户名, ...

  6. 谓词(NSPredicate)

    OC中的谓词操作是针对于数组类型的,他就好比数据库中的查询操作,数据源就是数组,这样的好处是我们不需要编写很多代码就可以去操作数组,同时也起到过滤的作用,我们可以编写简单的谓词语句,就可以从数组中过滤 ...

  7. Mac安装Mysql无法登录

    Mac安装的Mysql5.7.10 执行mysql -u root -p 就要求输入密码,但是新安装是没密码的.然后就会报错. ERROR 1045 (28000): Access denied fo ...

  8. warning(包括PHP中的notice)必须改吗?

    作者:马 岩(Furzoom) (http://www.cnblogs.com/furzoom/)版权声明:本文的版权归作者与博客园共同所有.转载时请在明显地方注明本文的详细链接,未经作者同意请不要删 ...

  9. mysql优化概析

    优化从几个方面来说: 表结构设计 适当索引(主键 普通 唯一 全文组合) mysql本身配置 硬件配置 SQL语句优化 存储过程 分表 分区 读写分离 清理垃圾数据

  10. 搭建FTP+PAM+MySQL环境

    搭建FTP+PAM+MySQL环境 1 搭建环境: CentOS6.5或CentOS6.7 [root@vhost3 ~]# uname -a Linux vhost3 -.el6.x86_64 # ...