通过实验带你认识linux下的源码编译


源代码是相对目标代码和可执行代码而言的。源代码是用汇编语言和高级语言写出来的代码。

目标代码是指源代码经过编译程序产生的能被cpu直接识别二进制代码。

可执行代码就是将目标代码链接后形成的可执行文件,也是二进制。

计算机源代码的最终目的是将人类可读的文本翻译成为计算机可以执行的二进制指令,这种过程叫做编译,通过编译器完成。即源码要运行,必须先转成二进制的机器码。这是编译器的任务。

微信公众号:运维之美
想了解更多IT技术内容,请公众号留言;
**

01 初识项目编译

安装一个简单的源代码项目通常包括以下步骤:

在服务器上创建一个工作目录,用于存放源代码和编译后的文件。假设我们将工作目录命名为project

mkdir project
cd project

创建源代码文件。你可以使用文本编辑器创建一个简单的C或C++源代码文件,然后保存为main.c

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}

使用适当的编译器来编译源代码文件,这里我们使用gcc编译

[master@knode1 project]$ gcc -o hello main.c  #GCC编译
[master@knode1 project]$ ls
main.c  hello             #生成hello的二进制文件
[master@knode1 project]$ ./hello
Hello, World!

看到成功输出Hello, World!,这是一个比较简单的源码编译过程。

02 编译过程

相信很多人都使用源码编译安装过nginx,通过都是先configure,然后执行make和make install进行安装,那么为什么上面编译过程这么简单呢?

对于简单的项目,我们可以在不使用make的情况下手动编译并运行可执行文件。

make通常用于更复杂的项目,如果每次修改了源码,都需要重新执行编译和链接两个过程。如果一旦源码文件很多了,重复操作很繁琐。可以通过make来一个步骤完成(使用makefile文件然后使用make宏编译)它可以自动处理编译和安装过程,尤其是对于具有多个源文件和依赖关系的项目。

所以如果项目简单,只包含一个源文件,像上面手动编译和运行就可以了,但是,对于更复杂的项目,使用make等构建工具可以更方便地管理编译和依赖关系。

编译安装过程

在这里插入图片描述

configure配置

编译器在开始工作之前,需要知道当前的系统环境,比如标准库在哪里、软件的安装位置在哪里、需要安装哪些组件等等。这是因为不同计算机的系统环境不一样,通过指定编译参数,编译器就可以灵活适应环境,编译出各种环境都能运行的机器码。这个确定编译参数的步骤,就叫做"配置"(configure)。

这些配置信息保存在一个配置文件之中,约定俗成是一个叫做configure的脚本文件。通常它是由autoconf工具生成的。编译器通过运行这个脚本,获知编译参数。

configure脚本已经尽量考虑到不同系统的差异,并且对各种编译参数给出了默认值。如果用户的系统环境比较特别,或者有一些特定的需求,就需要手动向configure脚本提供编译参数。

例如

./configure \
--prefix=/usr/local/nginx \    #指定nginx的安装路径
--user=nginx \                 #指定用户名
--group=nginx \                #指定组名
--with-http_stub_status_module #启用 http_stub_status_module 模块以支持状态统计

make

Makefile的文件,其中包含编译和安装的规则。这个文件定义了如何构建项目,包括编译每个源文件、链接库文件等。

make命令将根据Makefile文件中的规则自动执行编译过程。

make install

安装项目(如果有必要)。这通常会将可执行文件复制到系统目录,使其可以全局访问,而不用单独做命令的软连接(软连接通常在/usr/bin目录)。

03 完整的编译过程

知道了源码编译的完整过程,我们创建一个项目模拟一下编译过程,使用configure, make, 和 make install实现整个编译过程。

1、创建源代码文件

首先,你需要创建项目的源代码文件。这些文件包括源代码、头文件、配置文件和其他项目所需的文件,此处我们模拟最简单的hello,World程序

创建一个简单的C程序,将其保存为hello.c

echo '#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}' > hello.c

2、创建configure脚本

configure脚本用于检查系统环境并生成Makefile。通常,可以使用autoconf工具来生成configure脚本。在hello项目目录中,创建一个名为configure.ac的文件,然后运行autoconf来生成configure脚本

  • 创建configure.ac文件
AC_INIT([hello], [1.0], [youremail@example.com])
AC_PREREQ(2.69)
AC_CONFIG_SRCDIR([hello.c])
AC_CONFIG_HEADERS([config.h])

AM_INIT_AUTOMAKE

AC_PROG_CC

AC_CONFIG_FILES([Makefile])
AC_OUTPUT

3、创建Makefile.am

在项目目录中,创建一个名为Makefile.am的文件,其中包含有关如何构建项目的规则。

  • 创建Makefile.am文件
bin_PROGRAMS = hello
hello_SOURCES = hello.c

#检查准备好的文件

[root@knode1 project]# ls
configure.ac  hello.c  Makefile.am

准备项目文件

touch NEWS README AUTHORS ChangeLog
[root@knode1 hello]# ls
AUTHORS  ChangeLog  configure.ac  hello.c  Makefile.am  NEWS  README

注:小项目可能不需要这些额外的文件,只是要求 autoreconf 正常工作,touch创建这些文件,并将它们保持为空,只是为了用于符合 GNU 编程规范。

如果这些文件不存在,则会出现如下报错

[root@knode1 hello]# autoreconf --force --install
configure.ac:6: installing './install-sh'
configure.ac:6: installing './missing'
Makefile.am: installing './INSTALL'
Makefile.am: error: required file './NEWS' not found
Makefile.am: error: required file './README' not found
Makefile.am: error: required file './AUTHORS' not found
Makefile.am: error: required file './ChangeLog' not found
Makefile.am: installing './COPYING' using GNU General Public License v3 file
Makefile.am:     Consider adding the COPYING file to the version control system
Makefile.am:     for your code, to avoid questions about which license your project uses
Makefile.am: installing './depcomp'
autoreconf: automake failed with exit status: 1

准备好文件后,再次运行autoreconf

autoreconf --force --install

图片

成功生成了configure脚本,可以正式开始编译安装了

开始编译

图片

源码包安装

在这里插入图片描述

在实际使用中,你需要更详细的配置和规则,以满足特定项目的需求。配置过程可能会更复杂,需要处理依赖关系和其他构建选项。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

运维之美@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值