目录
1、GCC与gcc有什么不同?
2、什么是交叉编译?
3、编译、链接过程简介
4、如何理解"多语言混合开发"
5、gcc关键编译选项
GCC(GNU Compiler Collection)
- GNU编译器集合,包含众多语言的编译器(C,C++,Java,D,Objective-C,etc.)
gcc
- 特指GCC中的C语言编译器
GCC VS 嵌入式
- 多数嵌入式操作系统都基于GCC进行源码编译
Linux,VxWorks,Android,etc.
实际开发中的使用
- 内核开发:gcc
- 应用开发:gcc/g++/gdc
背景
- 嵌入式设备往往资源受限
- 不可能在嵌入式上直接对处理器进行编程
解决方案
- 在开发主机(PC)上对源码进行编译
- 最终生成目标主机(嵌入式设备)的可执行程序
gcc是如何进行交叉编译的?
- 配置目标主机的编译工具链(如:arm-linux)
- 配置工具链的具体版本
★ 根据具体的目标代码选择相应的工具链版本
★ 正确使用关于硬件体系结构的特殊编译选项
案例:大型企业嵌入式开发环境
编译、链接过程简介
多语言混合开发方式一
行业案例:.net framework
多语言混合开发方式二
行业案例:QQ
多语言混合开发方式三
行业案例:Eclipse
gcc关键编译选项一
- 预处理指令 gcc -E file.c -o file.i
- 编译指令 gcc -S file.i -o file.s
- 汇编指令 gcc -c file.s -o file.o
gcc关键编译选项二
- 生成映射文件 gcc -Wl,-Map=test.map file.c
- 宏定义 gcc -D'TEST="test"' file.c
- 获取系统头文件路径 gcc -v file.c
//func.h
#include
void func()
{
#ifdef TEST
printf("TEST = %s\n", TEST);
#endif
return;
}
//test.c
#include
#include "func.h"
int g_global = 0;
int g_test = 1;
int main(int argc, char *argv[])
{
func();
printf("&g_global = %p\n", &g_global);
printf("&g_test = %p\n", &g_test);
printf("&func = %p\n", &func);
printf("&main = %p\n", &main);
return 0;
}
gcc关键编译选项三
- 生成依赖关系
★ 获取目标的完整依赖关系 gcc -M test.c
★ 获取目标的部分依赖关系 gcc -MM test.c
gcc关键编译选项四
- 指定库文件及库文件搜索路径
★ -L 选项:指定库文件的搜索路径
★ -l 选项:指定库文件
gcc test.c -L. -lfunc
- 指定头文件路径 gcc -Idir test.c
//func.c
#include
void func()
{
#ifdef TEST
printf("TEST = %s\n", TEST);
#endif
return;
}
//test.c
#include
int g_global = 0;
int g_test = 1;
int main(int argc, char *argv[])
{
func();
printf("&g_global = %p\n", &g_global);
printf("&g_test = %p\n", &g_test);
printf("&func = %p\n", &func);
printf("&main = %p\n", &main);
return 0;
}