(024) Linux之编译程序

十年运维系列之基础篇 - Linux

作者:曾林

联系:[email protected]

网站:www.jplatformx.com

版权:文章未经同意请勿转载



一、引言

本章将介绍如何通过源代码来生成可执行程序。开放源代码是Linux自由开源的必要因素,整个Linux系统的开发依赖于开发人员之间的自由交流。对于多数桌面系统用户来说,编译已经是一门失传的艺术。编译技术虽然曾经非常普遍,但是如今,版本发行商却维护着很大的预编译二进制库,以便用户下载使用。

那么,为什么要编译软件呢?有如下两个原因:

  • 可用性:尽管有些发行版已经包含了版本库中的一些预编译程序,但不会包含用户所有可能需要的应用程序。这种情况下,用户获取所需要软件的唯一方式就是编译源代码。
  • 及时性:虽然有些发行版专注于一些前沿的程序版本,但是多数并不会。这就意味着想要获取最新版本的程序,编译是必不可少的。

二、什么是编译

简单来说,编译就是一个将源代码(由程序员编写的人类可读的程序描述)翻译成计算机处理器能识别的语言的过程。

计算机处理器(或CPU)在一个非常基础的层次上工作,只能运行称之为机器语言的程序。而机器语言其实就是一些数值代码,它描述的都是一些非常小的操作,比如“增加某个字节”、“指向内存中某个位置”或“复制某个字节”等,并且每一个这样的指令都是以二进制(0和1)的形式表示的。最早的计算机程序就是用这样的数值代码编写。

汇编语言的出现解决了这一问题,因为它用诸如CPY(复制)和MOV(转移)等更容易的助记符取代了那些数值代码,汇编语言编写的程序会由汇编程序(assembler)处理成机器语言。如今,汇编语言仍然用于某些专门的编程任务,诸如设备驱动和嵌入式系统等。

之后便出现了高级语言编程,被称为高级语言是因为它们可以让程序员少关注些处理器的操作细节而把更多的精力集中在解决手头的问题上。

高级语言编写的程序通过编译器转换为机器语言。有些编译器则将高级语言程序转换为汇编语言,然后再使用一个汇编程序(assembler)将其转换为机器语言。

经常和编译一起使用的步骤就是链接。程序执行着许多共同的任务。例如:打开一个文件,许多程序都会需要进行此操作。如果每个程序都采用自己的方式实现该功能的话便是一种浪费。编写一个用于打开文件的单个程序,并允许其他程序共享它,反而更有意义。提供这种通用任务支持功能的便是库,库中包含了很多的例程,每一个实现的都是许多程序能够共享的通用任务。在/lib和/usr/lib目录中,我们可以发现很多这样的程序。链接器(linker)程序可以实现编译器的输出与编译程序所需要库之间的链接。该操作的最后结果就是生成一个供使用的可执行文件。

时间: 2024-07-29 13:02:45

(024) Linux之编译程序的相关文章

Linux下编译程序时,经常会遇到“undefined reference to XXX” 报错,

Linux下编译程序时,经常会遇到“undefined reference to XXX” 报错, 这里总结一些可能的原因和解决方案,给需要的朋友: 说道undefined reference error,先提一下Linux gcc链接规则: 链接的时候查找顺序是: -L 指定的路径, 从左到右依次查找 由 环境变量 LIBRARY_PATH 指定的路径,使用":"分割从左到右依次查找 /etc/ld.so.conf 指定的路径顺序 /lib 和 /usr/lib (64位下是/lib

linux GCC编译程序的过程

使用gcc编译程序时,编译过程可以细分为四个阶段: 预处理 预处理过程读入程序源代码,检查包含预处理指令的语句和宏定义,并对源代码进行相应的转换.预处理过程会删除程序中的注释和多余的空白字符. 编译 编译阶段中,gcc首先检查代码的规范性,是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言. 汇编 汇编阶段是把在编译阶段产生的汇编文件转成目标代码. 链接 将编译输出的文件链接成最终可执行的二进制文件 如图: 示例: vi hello.c #include <s

linux平台学x86汇编(八):条件跳转

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 在此之前我们使用的汇编代码示例都是从第一条指令开始,直到最后最后一条指令程序退出.但实际上和高级语言类似,汇编代码也提供指令来改变程序处理数据方式. 正常情况下,程序要执行要执行的下一条指令是在指令指针寄存器中,指令指针确定程序中哪条指令是应该执行的下一条指令. 当指令指针在程序指令中移动时,EIP寄存器会递增.指令长度可能是多个字节,所以指向下一条指令不仅仅是每次是指令指针

linux 内核升级2 转

linux内核升级 一.Linux内核概览 Linux是一个一体化内核(monolithic kernel)系统. 设备驱动程序可以完全访问硬件. Linux内的设备驱动程序可以方便地以模块化(modularize)的形式设置,并在系统运行期间可直接装载或卸载. 1. linux内核 linux操作系统是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件. 一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割. 计算机的硬件,含有外围设备.处理器.内存.硬盘和其他的电子设

Centos6.5下虚拟机Linux 关于g++,gdb,ctags安装以及vim的配置

安装g++,gdb,ctags以及对vim的配置的目的: g++,gdb,ctags可以方便我们在Linux下编译程序,调试程序: 对vim进行配置的目的: 进行vim配置,可以让我们在后续敲代码更加方便.按F5可以直接编译并执行C.C++代码以及执行shell脚本:按"F8"可进行C.C++代码的调试:"Ctrl + A"为全选并复制快捷键,方便复制代码:按"F2"可以直接消除代码中的空行:F3"可列出当前目录文件,打开树状文件目录:

Windows远程调试Linux上的C++程序:Eclipse+MingW+Samba+GDBserver

转自:http://www.heimizhou.com/windows-remote-debug-linux-c-plus-plus.html 最近有一个需求,就是需要在Windows上远程调试Linux上的C++程序,然后我就从网上搜集各种方法,但是发现很多方法中是先在Windows上编译程序,然后再从Linux上编译程序,最后进行远程调试,这种方法使我的调试不能进入源代码,后来经过尝试发现只需要在Linux上编译程序即可.下面从三个方面:需要安装的软件.安装与配置.配置远程调试,来介绍一下我

【免费下载】全套最新 4.Linux网络服务管理 视频教程+教学资料+学习课件+源代码+软件开发工具

4.Linux网络服务管理视频教程 网盘地址: 链接:https://pan.baidu.com/s/1fI-9MOiD8Q6sJIsaqsLaEw 提取码:44yi 加公众号 获取更多新教程 教程目录大纲 ./4.Linux服务管理 └── Linux网络服务视频 ├── 001_Linux云计算-网络服务-网络服务基础 │?? ├── 1.资料 │?? │?? ├── 001_-Linux云计算-网络服务-网络服务概述.pdf │?? │?? ├── 002_-Linux云计算-网络服务-网

gcc g++支持C++11 标准编译及其区别

g++ -g -Wall -std=c++11 main.cpp gcc -g -Wall -std=c11 main.cpp 如果不想每次写这个-std=C++11这个选项该怎么办呢? 方法出处:http://stackoverflow.com/questions/16886591/how-do-i-enable-c11-in-gcc 方法1:写Makefile 方法2:取别名 :alias g++11="g++ -std=c++11" -----------------------

内核升级2.6.11-3.0.2

-------------------------------------------------------- http://blog.chinaunix.net/uid-26000296-id-4208526.html linux内核升级图文攻略 2014-04-14 12:05:44 一.Linux内核概览Linux是一个一体化内核(monolithic kernel)系统.设备驱动程序可以完全访问硬件.Linux内的设备驱动程序可以方便地以模块化(modularize)的形式设置,并在系