嵌入式杂记(一)

1.环境变量

1.linux环境中,临时设置系统环境变量,每次重启加入的环境变量会消失,在命令行输入:

export PATH=$PATH:/home/xxx/xxx/

2.永久设置环境变量,重启也不会消失

sudo vi /etc/profile

在文件尾添加

export PATH=$PATH:/home/xxx/xxx/

冒号后面是要新加入的环境变量

2.交叉编译器

交叉编译器是在宿主机上运行的编译器,但是编译后得到的二进制程序却不能在宿主机上运行,而只能在目标机上运行。交叉编译器命名方式一般遵循“处理器-系统-gcc”这样的规则,一般通过名称便可以知道交叉编译器的功能。例如下列交叉编译器:

arm-none-eabi-gcc, 表示目标处理器是 ARM,不运行操作系统,仅运行前后台程序;
arm-uclinuxeabi-gcc, 表示目标处理器是 ARM,运行 uClinux 操作系统;
arm-none-linux-gnueabi-gcc, 表示目标处理器是 ARM,运行 Linux 操作系统;
mips-linux-gnu-gcc, 表示目标处理器是 MIPS,运行 Linux 操作系统。

进行 ARM Linux 开发,通常选择 arm-linux-gcc 交叉编译器。 ARM-Linux 交叉编译器可
以自行从源代码编译,也可以从第三方获取。在能从第三方获取交叉编译器的情况下,请尽量采用第三方编译器而不要自行编译,一是编译过程繁琐,不能保证成功,二是就算编译成功,也不能保证交叉编译器的稳定性,编译器的不稳定性会对后续的开发带来无限隐患。而第三方提供的交叉编译器通常都经过比较完善的测试,确认是稳定可靠的。

3.压缩与解压

tar  -cvf  目标文件名.gz     要压缩的文件
 tar xjvf arm-none-linux-gnueabi.tar.bz2 -C /home/ctools/

-C /home/ctools/ 为解压到目的路径下

4.编译过程

在这里插入图片描述
1.预处理,将.h文件展开到对应的.c ,将.c文件生成.i

gcc -E hello.c –o hello.i

2.编译,将.i文件翻译成.S汇编文件

gcc -S hello.i

3.汇编,将.S文件翻译成机器码.o文件,这个还不能执行

gcc -c hello.s

4.链接,将各个.o文件连接为一个整体,形成一个可执行文件

 gcc hello.o

5. MD5SUM校验文件

使用md5sum函数可以校验两个文件是否相同,命令如下:

md5sum  A  B

在这里插入图片描述

6.动态链接和静态链接

  • 动态链接使用动态链接库进行链接,生成的程序在执行的时候需要加载所需的动态库才能运行。动态链接生成的程序小巧,但是必须依赖动态库,否则无法执行。
 Linux 下的动态链接库实际是共享目标文件(shared object), 一般是.so 文件,
 作用类似于 Windows 下的.dll 文件。
  • 静态链接使用静态库进行链接,生成的程序包含程序运行所需要的全部库,可以直接运行,不过体积较大。
Linux 下静态库是汇编产生的.o 文件的集合, 一般以.a 文件形式出现

gcc 默认是动态链接,加上-static 参数则采用静态链接。再来看 hello.c 示例,在链接的
时候加上-static 参数:

 gcc hello.o -static -o hello_static

使用库文件,linux下一般有两种做法
1.一种是在编译列表中写出库文件全名(可带路径)

gcc hello.c libFOO.a 或者 gcc hello.c libFOO.so

2.另一种方式是分别用“-L”指定库文件路径,并用“-l”参数加上 FOO 名称即可,无需库文件全名:

gcc hello.c -L /home/vmuser/hello -lFOO

7.创建静态库和共享库

  1. 创建静态库
    静态库是.o 文件的集合,这些.o 文件是编译器按照常规方法生成的,在 Linux 下也称文档(archive),用 ar 工具来管理。

下面以用两个 c 文件来创建静态库为例进行讲述。

在用户主目录下,创建一个 libhelloa目录,并在其中创建 hello1.c 和 hello2.c 两个文件:
/* hello1.c */
	#include <stdio.h>
	int hello1 (void)
	{
	printf("hello 1!\n");
	return 0;
	}

/* hello2.c */
	#include <stdio.h>
	int hello2 (void)
	{
	printf("hello 2!\n");
	return 0;
	}

执行gcc -c hello1.c hello2.c
编译完成,将会得到 hello1.o 和 hell2.o 两个目标文件。接着,用 ar 命令即可创建一个库文件。输入下列命令:

ar -r libhello.a hello1.o hello2.o

显示ar: creating libhello.a 就创建成功了。

2.创建共享库:
共享库也是目标文件的集合,但这些文件是由编译器按照特殊方式生成的。对象模块的
每个地址(函数调用和变量引用)都是相对地址,允许在运行时被动态加载和运行。
创建共享库首先需要编译对象模块。继续以 hello1.chello2.c 为例进行示范。在用户
主目录下创建 libhelloso 目录,将前面两个.c 文件复制到其中,然后执行:

 gcc -c -fpic hello1.c hello2.c

与创建静态库不同,这里加入了-fpic 参数,表示生成的对象模块是可重定位的, pic 表
示位置独立代码(Position Independent Code
编译完成,得到了 hell1.ohello2.o 两个文件,再用下列命令生成共享库:

gcc -shared hello1.o hello2.o -o libhello.so

上面是分步进行介绍的,可以将两条命令合成一条命令,直接编译 c 文件得到.so 共享
库:

gcc -fpic -shared hello1.c hello2.c -o libhello.so

8.头文件包含

A #include <head.h>
B #include"myhead.h"
A 类使用尖括号(< >), B 类使用双引号(" "),这两种情况并不仅仅是写法上的差异,对
编译器而言,是有不同的意义的:

对于使用尖括号的第一种情况,预处理器会在系统预设的头文件包含目录搜索头文件。

对于使用双引号的第二种情形,预处理程序则在目标文件的文件夹内搜索相应文件,如果当前路径没有找到所包含的头文件,则会到系统预设目录进行搜索。也就是说,使用双引号的搜索路径包含了使用尖括号的情形。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值