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.创建静态库和共享库
- 创建静态库
静态库是.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.c
和 hello2.c
为例进行示范。在用户
主目录下创建 libhelloso
目录,将前面两个.c
文件复制到其中,然后执行:
gcc -c -fpic hello1.c hello2.c
与创建静态库不同,这里加入了-fpic 参数,表示生成的对象模块是可重定位的, pic 表
示位置独立代码(Position Independent Code
)
编译完成,得到了 hell1.o
和 hello2.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 类使用双引号(" "),这两种情况并不仅仅是写法上的差异,对
编译器而言,是有不同的意义的:
对于使用尖括号的第一种情况,预处理器会在系统预设的头文件包含目录搜索头文件。
对于使用双引号的第二种情形,预处理程序则在目标文件的文件夹内搜索相应文件,如果当前路径没有找到所包含的头文件,则会到系统预设目录进行搜索。也就是说,使用双引号的搜索路径包含了使用尖括号的情形。