arm-linux-gcc编译器测试
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编译器测试的更多相关文章
- 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 ...
- <转载>linux gcc编译器中使用gdb单步调试程序,程序不是顺序执行的。
原文地址http://blog.csdn.net/abc78400123/article/details/6779108 在用gdb调试,使用s 或n单步执行程序时,发现程序不是按顺序运行的,有时莫名 ...
- Linux gcc编译器
GNU CC(通常称为GCC)是GNU项目的编译器,他能够编译C.C++语言编写的程序. 使用gcc,程序员可以对编译过程有更多控制,编译过程分为3个阶段. --预处理 --汇编 --链接 程序员可以 ...
- 在Ubuntu下安装gcc编译器+测试
1.输入命令: sudo apt-get install gcc libc6-dev 2.创建文件hello.c使用命令: touch hello.c 3.在hello.c中写入: #include ...
- Linux系统(本例以Ubuntu18.04为例)安装GCC编译器
Linux(本例以Ubuntu18.04为例)安装GCC编译器 一.安装 安装命令:sudo apt-get build-dep gcc 遇到 您希望继续执行吗? [Y/n] y 直接输入y回车即 ...
- Linux安装gcc编译器详解
本人使用的是CentOS 6.5 64位系统,由于在安装系统的时候并没有勾选安装gcc编译器,因此需要自行安装gcc编译器. 使用yum安装gcc 对于配备了yum的Linux发行版而言,安装gcc编 ...
- Linux环境下的GCC编译器与GDB调试工具介绍
假如现在我们有如下代码需要编译运行和调试.文件名为:test.c #include <stdio.h> int main() { int day, month, year, sum, le ...
- linux gcc 区分32位或64位编译 && 请问arm存储,是以小端格式还是以大端格式?
linux gcc 区分32位或64位编译 Linux系统下程序如何区分是64位系统还是32位系统 经过对include的翻查,最后确定gcc以__i386__来 进行32位编码,而以__x86_ ...
- linux应用之gcc编译器的安装及使用
gcc是linux系统下功能十分强大的编译器. 本人使用的是CentOS 6.6 64位系统,由于在安装系统的时候并没有勾选安装gcc编译器,因此需要自行安装gcc编译器. 使用yum安装gcc 对于 ...
- Linux下GCC编译器的安装
通过apt-get方式下载的Qt5.9的gcc编译器版本只是4.8.3,无法打开一些Qt5的库头文件,所以准备在Llinux下再安装一个gcc5.3.0. 查看gcc版本 ubuntu下查看gcc的版 ...
随机推荐
- stl之deque双端队列容器
deque与vector很相似,不仅能够在尾部插入和删除元素,还能够在头部插入和删除. 只是当考虑到容器元素的内存分配策略和操作性能时.deque相对vector较为有优势. 头文件 #include ...
- [Javascript] Object.freeze() vs Object.seal()
let person = { firstName: "Zhentian", lastName: "Wan" }; /*Object.freeze() makes ...
- Openstack中间DVR Part1 -- 东西走向的交通处理
作者:Liping Mao 发表于:2014-07-04 版权声明:能够随意转载.转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 在Openstack中L3router会造成流量集中 ...
- Linux守护进程的编程实现
Linux 守护进程的编程方法 守护进程(Daemon)是执行在后台的一种特殊进程.它独立于控制终端而且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种非常实用的进程.Linux的大多数s ...
- iOS 中UI控件的各种对齐方式总结
1.textAligment : 文字的水平方向的对齐方式 取值 NSTextAlignmentLeft = 0, // 左对齐 NSTextAlignmentCenter = ...
- mysql 如何修改字符串为 utf8
1.命令行输入mysl 密码之后,然后输入 status可以查看当前的编码 2.来到安装目录X:\%path%\MySQL\MySQL Server 5.0\bin\MySQLInstanceConf ...
- 读取properties文件
假设项目名称为myproject public class UtilConfig { private static final Properties prop; static { prop = new ...
- PHP + ajax 实现异步登录验证
login.html: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...
- Java联网技术之一TCP
最近突然对java网络编程编程这一块非常感兴趣,于是找了很多资料,一点点的尝试,下面是自己的一点小见解,不喜勿喷,欢迎指正. 首先说说客户端和服务器端吧, 如果是网页的话,客户端通过网页的链接对服务器 ...
- C++Primer笔记二
真是一本好书,就这么点,就感觉学到很多了,当然也是我水平太差. 用shell或者bash的时候有一个文件重定向,就是每次程序运行的时候,我们都需要手动输入内容,然后程序输出内容,这时可以用文件来代替. ...