linux 编译链接过程,编译程序 一:linux程序编译过程(一)-编译和链接
大家肯定都知道计算机程序设计语言通常分为机器语言、汇编语言和高级语言三类。高级语言需要通过翻译成机器语言才能执行,而翻译的方式分为两种,一种是编译型,另一种是解释型,因此我们基本上将高级语言分为两大类,一种是编译型语言,例如C,C++,Java,另一种是解释型语言,例如Python、Ruby、MATLAB 、JavaScript。
本文将介绍如何将高层的C/C++语言编写的程序转换成为处理器能够执行的二进制代码的过程,包括四个步骤:
预处理(Preprocessing)
编译(Compilation)
汇编(Assembly)
链接(Linking)
一般来说,对C、C++程序、先把源文件编译成中间代码文件。Linux下是 .o 文件即 Object File,在Windows下也就是 .obj 文件,这个动作叫做编译(compile)。然后再把大量的.O文件合成执行文件,这个动作叫作链接(link)
编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是让我们告诉编译器头文件的所在位置(头文件中放声明,而定义放在C/C++文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件(.O文件或是OBJ文件)。
链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(.O文件或.OBJ文件)来链接我们的应用程序。链接器并不管函数所在的源文件,只管函数的中间目标文件。在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目标文件打个包,在Windows下这种包叫“库文件”(Library File),也就是 .lib 文件,在Linux下,是Archive File,也就是 .a 文件
总的来说就是,首先源文件-> .o文件,再由.o文件->可执行文件。在编译时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。而在链接程序时,链接器会在所有的.o文件中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error):下面我们看个例子
(一)、Linux 编译和链接程序
1、在北京大学北极星高性能计算平台解压如下文件:
[test_pkuhpc@login12 2019test]$ unzip /gpfs1/web-q/linux-shell/conf/multi_c_program_linux.zip
2、查看下解压后的文件:
[test_pkuhpc@login12 cankao_multi_c_program_linux]$ ls
add.c all main.c makefile test.h
3、查看文件内容
[test_pkuhpc@login12 cankao_multi_c_program_linux]$ cat main.c
#include "test.h"
int main(void)
{
int a =3;//初始化两个整数
int b = 5;
printf("%d + %d = %d \n", a, b, add(a, b));//这里调用函数
return 0;
}
[test_pkuhpc@login12 cankao_multi_c_program_linux]$ cat add.c
#include "test.h"
int add(int a, int b)
{
return a+b;//求和运算
}
4、编译主文件
[test_pkuhpc@login12 cankao_multi_c_program_linux]$ gcc -c main.c -o main.o
5、编译函数
[test_pkuhpc@login12 cankao_multi_c_program_linux]$ gcc -c add.c -o add.o
6、链接*.o文件
[test_pkuhpc@login12 cankao_multi_c_program_linux]$ gcc main.o add.o -o all
7、测试:
[test_pkuhpc@login12 cankao_multi_c_program_linux]$ ./all
3 + 5 = 8
linux 编译链接过程,编译程序 一:linux程序编译过程(一)-编译和链接相关推荐
- G++ 4.4.7 无法编译模板程序,Vs可以,和解?智者尾部留言,本人第一次使用vs pro,通常并且习惯在linux下写些小东西,虽然程序简单;...
G++ 4.4.7 无法编译模板程序,Vs可以,和解?智者尾部留言,本人第一次使用vs pro,通常并且习惯在linux下写些小东西,虽然程序简单; vs 模板编译运行Ok \ linux g++ 4 ...
- Android 系统 (79)---Android应用程序安装过程解析
Android应用程序安装过程解析 Android应用程序安装过程解析 1.程序安装的4大步骤 (1) 拷贝apk文件到指定目录 在Android系统中,apk安装文件是会被保存起来的,默认情况下,用 ...
- matlab能否独立做程序,如何将MATLAB程序编译成独立可执行的程序
如何将MATLAB程序编译成独立可执行的程序?如何将编译好的独立可执行程序发布在没有安装MATLAB的电脑上?下面将一步步实现: 一.生成独立可执行的程序(exe文件)步骤 1.安装编译器.可有多种选 ...
- Linux程序在预处理、编译、汇编、链接、运行步骤的作用
创建一个hello.c文件,按步骤操作: 一.预编译 <生成 hello.i文件 > 操作步骤:gcc -E hello.c -o hello.i 1.将所有的#define删除,并展开所 ...
- linux怎么用gcc运行程序设计,linux应用程序设计--GCC程序编译
GCC程序编译 linux系统下的GCC(GNU C Compiler)是GNU推出的功能强大.性能优越的多平台编译器,是GNU的代表作之一.GCC可以在多种硬件平台上编译出可执行程序,其执行效率与一 ...
- mysql实现程序的动态链接_程序的链接和装入及Linux下动态链接的实现
链接器和装入器的基本工作原理 一个程序要想在内存中运行,除了编译之外还要经过链接和装入这两个步骤.从程序员的角度来看,引入这两个步骤带来的好处就是可以直接在程序中使用printf和errno这种有意义 ...
- Linux下C程序的编辑,编译和运行以及调试
...
- soc eds能 编译linux,【转】在SoCEDS环境下编译和更新preloader和uboot程序的方法
[转]在SoCEDS环境下编译和更新preloader和uboot程序的方法 [复制链接] 在SoCEDS环境下编译和更新preloader和uboot程序的方法 前面有介绍preloader在HPS ...
- 对C语言程序进行编译时 针对以下情况,linux书上划的题的答案.doc
一块硬盘上可以有几种类型的分区?各自可以有多少个?在他们上面能否安装linux系统? 硬盘分区有三种类型的分区;主分区.扩展分区.逻辑分区.一个硬盘最多能划分为4个主分区,或者3个主分区加上1个扩展分 ...
最新文章
- E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)E: U
- 域用户不能使用远程桌面登录
- Android定位开发之百度定位、高德定位、腾讯定位,三足鼎立一起为我所用!
- Zen Coding 系列教程一:入门
- 干货:12个案例教你用Python玩转数据可视化(建议收藏)
- 魔兽服务器联盟在线,《魔兽世界》怀旧服再开新服,部落联盟泾渭分明?
- 【java】JVM中Perm区持续上涨问题
- java多线程下载图片_java多线程批量下载图片(通用版)
- [原创]Android秒杀倒计时自定义TextView
- Symbian检测是否有存储卡
- 计算机硬盘格式分类,fat32是什么?
- 真实有效解决Open browser failed!! Please check if you have installed the browser correctly!
- -webkit-border-radius和-moz-border-radius分析
- Firefox 59 正式发布:改进页面加载速度和屏幕截图工具
- WannaCry勒索病毒处理指南
- VUE+ElementUI的表单el-from表单验证二选一必填项,并且满足条件后会清除表单验证提示。
- 如何理解和成为测试工程师
- c++实现sqrt函数功能
- 私钥和公钥?什么是数字签名?
- BingoCloudOS V8.0 平台智能体检功能实践