大家肯定都知道计算机程序设计语言通常分为机器语言、汇编语言和高级语言三类。高级语言需要通过翻译成机器语言才能执行,而翻译的方式分为两种,一种是编译型,另一种是解释型,因此我们基本上将高级语言分为两大类,一种是编译型语言,例如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程序编译过程(一)-编译和链接相关推荐

  1. G++ 4.4.7 无法编译模板程序,Vs可以,和解?智者尾部留言,本人第一次使用vs pro,通常并且习惯在linux下写些小东西,虽然程序简单;...

    G++ 4.4.7 无法编译模板程序,Vs可以,和解?智者尾部留言,本人第一次使用vs pro,通常并且习惯在linux下写些小东西,虽然程序简单; vs 模板编译运行Ok \ linux g++ 4 ...

  2. Android 系统 (79)---Android应用程序安装过程解析

    Android应用程序安装过程解析 Android应用程序安装过程解析 1.程序安装的4大步骤 (1) 拷贝apk文件到指定目录 在Android系统中,apk安装文件是会被保存起来的,默认情况下,用 ...

  3. matlab能否独立做程序,如何将MATLAB程序编译成独立可执行的程序

    如何将MATLAB程序编译成独立可执行的程序?如何将编译好的独立可执行程序发布在没有安装MATLAB的电脑上?下面将一步步实现: 一.生成独立可执行的程序(exe文件)步骤 1.安装编译器.可有多种选 ...

  4. Linux程序在预处理、编译、汇编、链接、运行步骤的作用

    创建一个hello.c文件,按步骤操作: 一.预编译 <生成 hello.i文件 > 操作步骤:gcc -E hello.c -o hello.i 1.将所有的#define删除,并展开所 ...

  5. linux怎么用gcc运行程序设计,linux应用程序设计--GCC程序编译

    GCC程序编译 linux系统下的GCC(GNU C Compiler)是GNU推出的功能强大.性能优越的多平台编译器,是GNU的代表作之一.GCC可以在多种硬件平台上编译出可执行程序,其执行效率与一 ...

  6. mysql实现程序的动态链接_程序的链接和装入及Linux下动态链接的实现

    链接器和装入器的基本工作原理 一个程序要想在内存中运行,除了编译之外还要经过链接和装入这两个步骤.从程序员的角度来看,引入这两个步骤带来的好处就是可以直接在程序中使用printf和errno这种有意义 ...

  7. Linux下C程序的编辑,编译和运行以及调试

                                                                                                        ...

  8. soc eds能 编译linux,【转】在SoCEDS环境下编译和更新preloader和uboot程序的方法

    [转]在SoCEDS环境下编译和更新preloader和uboot程序的方法 [复制链接] 在SoCEDS环境下编译和更新preloader和uboot程序的方法 前面有介绍preloader在HPS ...

  9. 对C语言程序进行编译时 针对以下情况,linux书上划的题的答案.doc

    一块硬盘上可以有几种类型的分区?各自可以有多少个?在他们上面能否安装linux系统? 硬盘分区有三种类型的分区;主分区.扩展分区.逻辑分区.一个硬盘最多能划分为4个主分区,或者3个主分区加上1个扩展分 ...

最新文章

  1. E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)E: U
  2. 域用户不能使用远程桌面登录
  3. Android定位开发之百度定位、高德定位、腾讯定位,三足鼎立一起为我所用!
  4. Zen Coding 系列教程一:入门
  5. 干货:12个案例教你用Python玩转数据可视化(建议收藏)
  6. 魔兽服务器联盟在线,《魔兽世界》怀旧服再开新服,部落联盟泾渭分明?
  7. 【java】JVM中Perm区持续上涨问题
  8. java多线程下载图片_java多线程批量下载图片(通用版)
  9. [原创]Android秒杀倒计时自定义TextView
  10. Symbian检测是否有存储卡
  11. 计算机硬盘格式分类,fat32是什么?
  12. 真实有效解决Open browser failed!! Please check if you have installed the browser correctly!
  13. -webkit-border-radius和-moz-border-radius分析
  14. Firefox 59 正式发布:改进页面加载速度和屏幕截图工具
  15. WannaCry勒索病毒处理指南
  16. VUE+ElementUI的表单el-from表单验证二选一必填项,并且满足条件后会清除表单验证提示。
  17. 如何理解和成为测试工程师
  18. c++实现sqrt函数功能
  19. 私钥和公钥?什么是数字签名?
  20. BingoCloudOS V8.0 平台智能体检功能实践

热门文章

  1. PIL 学习笔记(3)
  2. 京东商城-商城研发部 算法岗面试
  3. 第四次作业 孙保平034 李路平029
  4. oracle存储过程、声明变量、for循环(转)
  5. 变量声明和定义有什么区别
  6. Flash,一次Bug的思考
  7. VS2008中文正式版发布了,附下载链接!
  8. linux shell rm 删除子目录下 所有.o后缀文件
  9. linux dmesg 格式化时间
  10. 数字货币 如何验证Electron Cash钱包 软件来源的可靠性