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

news2025/7/18 9:02:24

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

  • 01 初识项目编译
  • 02 编译过程
  • 03 完整的编译过程
    • 1、创建源代码文件
    • 2、创建configure脚本
    • 3、创建Makefile.am

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

目标代码是指源代码经过编译程序产生的能被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脚本,可以正式开始编译安装了

开始编译

图片

源码包安装

在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1096058.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

qml介绍

文章目录 qml简介对象一个风车的例子 qml简介 从 Qt 4.7 开始&#xff0c;Qt 引入了一种声明式脚本语言&#xff0c;称为 QML&#xff08;Qt Meta Language 或者 Qt Modeling Language&#xff09;&#xff0c;作为 C 语言的一种替代。而 Qt Quick 就是使用 QML 构建的一套类库…

(latex中appendix附录怎么写)以及(附录里面的图片表格之类的如何重新编号)

文章目录 初级&#xff1a;怎么写进阶&#xff1a;怎么重新编号进阶&#xff1a;怎么换成单栏格式 初级&#xff1a;怎么写 这个很简单&#xff0c;我一开始以为很复杂。 \begin{document} #这里是“正文”。 #这里是“引用”。 #下面开始是附录。 \appendix \section{Proofs…

英语——分享篇——每日100词——801-900

medical——adj.医疗的——me我(熟词)di弟(拼音)cal擦了(拼音) chief——n.酋长——thief小偷——小偷拜见酋长 pork——n.猪肉——p皮鞋(编码)or偶人(拼音)k机关枪(编码)——穿着皮鞋的偶人扛着机关枪挑猪肉 pie——n.馅饼&#xff0c;派——瞥——他无意瞥见一块馅饼 saus…

GB28181平台简介

产品简介 LiveMedia视频中间件是支持部署到本地服务器或者云服务器的纯软件服务&#xff0c;也提供服务器、GPU一体机全包服务&#xff0c;提供视频设备管理、无插件、跨平台的实时视频、历史回放、语音对讲、设备控制等基础功能&#xff0c;支持视频协议有海康、大华私有协议…

Golang学习记录:基础篇练习(一)

Golang学习记录&#xff1a;基础篇练习&#xff08;一&#xff09; 1、九九乘法表2、水仙花数3、斐波那契数列4、编写一个函数&#xff0c;求100以内的质数5、统计字符串里面的字母、数字、空格以及其他字符的个数6、二维数组对角线的和7、冒泡排序算法8、选择排序算法9、二分查…

JDK 19 协程新特性学习

目录 一、协程定义 二、协程发展史 &#xff08;一&#xff09;协程的基本发展史说明 &#xff08;二&#xff09;Java协程发展说明 三、JDK 19 协程的原理细节 &#xff08;一&#xff09;Thread.ofVirtual().start() &#xff08;二&#xff09;SocketChannel.write(…

没有前端如何测试后端跨域问题

一、问题 前段时间对项目中的跨域做了相关的处理&#xff0c;网上有很多跨域的解决方案。前端解决&#xff0c;后端解决&#xff0c;nginx代理解决。我采用的是在后端中使用Cors来解决跨域的问题。但是前端项目还没有搭建起来&#xff0c;并不知道Cors的解决方案是否会生效&am…

揭秘元宇宙背后最炫科技风:数字经济时代,元宇宙发展解决方案及核心技术

文章目录 前言一、关于“元宇宙”业界趋势1.1、元宇宙的概念与发展历程1.2、行业应用体验向虚实融合和实时互动演进1.3、数字内容成为各行业 3D 数字世界入口 二、对于元宇宙发展的解决方案和实践2.1、MetaStudio 构建场景化全栈能力2.2、企业 3D 空间&#xff0c;围绕 4 类场景…

PyQt界面里如何加载本地视频以及调用摄像头实时检测(小白入门必看)

目录 1.PyQt介绍 2.代码实现 2.1实时调用摄像头 2.2 使用YOLOv5推理 2.3 代码中用到的主要函数 1.PyQt介绍 PyQt是一个用于创建桌面应用程序的Python绑定库&#xff0c;它基于Qt框架。Qt是一个跨平台的C应用程序开发框架&#xff0c;提供了丰富的图形界面、网络通信、数据…

Qt项目通过.pri文件将众多文件按功能模块分类显示,开发大型项目必备

Qt项目通过.pri文件将众多文件按功能模块分类显示&#xff0c;开发大型项目必备 Chapter1 Qt项目通过.pri文件将众多文件按功能模块分类显示&#xff0c;开发大型项目必备($$$)Chapter2 在Qt项目中添加pri文件前言创建pri文件的步骤一、创建Qt项目二、创建pri空文件三、调试 Ch…

SpringCloud学习笔记-Nacos服务分级存储模型

Nacos服务分级存储模型 一级是服务&#xff0c;例如userservice二级是集群&#xff0c;例如杭州或上海三级是实例&#xff0c;例如杭州机房的某台部署了userservice的服务器 微服务互相访问时&#xff0c;应该尽可能访问同集群实例&#xff0c;因为本地访问速度更快。当本集…

创新YOLOv8改进:结合全新可变形大核注意力(D-LKA Attention)实现多尺度目标涨点

🔥🔥🔥 提升多尺度目标检测,创新提升 🔥🔥🔥 🔥🔥🔥 捕捉图像特征和处理复杂图像特征 🔥🔥🔥 👉👉👉: 本专栏包含大量的新设计的创新想法,包含详细的代码和说明,具备有效的创新组合,可以有效应用到改进创新当中 👉👉👉: 🐤🐤�…

寻找AI时代的关键拼图,从美国橡树岭国家实验室读懂AI存力信标

超算&#xff0c;是计算产业的明珠&#xff0c;是人类探索未知的航船。超算的发展与变化&#xff0c;不仅代表着各个国家与地区间的科技竞争力&#xff0c;更将作为趋势风向标&#xff0c;影响整个数字化体系的走向。 在目前阶段&#xff0c;超算与AI计算的融合是大势所趋。为了…

C# GPEN-BFR 图像修复

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Windows.Forms;namespace 图像修复 {pu…

【部署】Linux Shell脚本部署java程序 (jar包)

文章目录 前言 前言 #!/usr/bin/env bash #可变参数变量#部署磁盘路径 baseDirPath/data/apps/java/smj-exchange-upload #jar包名称 packageNamesmj-exchange-upload.jar #命令启动包名 xx.jar的xxpid #进程pid#检测pid getPid(){echo "检测状态-----------------------…

Python爬虫:某书平台的Authorization参数js逆向

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据开发、数据分析等。 🐴欢迎小伙伴们点赞👍🏻、收藏⭐️、…

深势科技基于 Serverless 容器为科研人员打造高效的开发平台

作者&#xff1a;李样兵、刘杉、木环、玖宇、鼎岳 云端的科学研究&#xff0c;AI for Science 新范式 以往科学家们的科研工作需要经过大量实验的重复验证、复杂数学计算&#xff0c;以及长年累月的不断试错和苦苦探索。云计算基础服务的发展和人工智能技术 AI 的兴起&#x…

自动驾驶学习笔记(五)——绕行距离调试

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《2023星火培训【感知专项营】》免费课程—>传送门 文章目录 前言 调试内容 打开在线编辑器 打开pl…

【Docker 内核详解】namespace 资源隔离(五):User namespaces

【Docker 内核详解 - namespace 资源隔离】系列包含&#xff1a; namespace 资源隔离&#xff08;一&#xff09;&#xff1a;进行 namespace API 操作的 4 种方式namespace 资源隔离&#xff08;二&#xff09;&#xff1a;UTS namespace & IPC namespacenamespace 资源隔…

narak靶机

信息搜集 主机发现 端口扫描 靶机开放了22/ssh , 80/http端口服务 UDP协议扫描端口 没有啥发现 综合扫描 web渗透 web页面 登陆80web页面&#xff0c;进行信息收集&#xff0c;在源代码和页面中似乎都没发现什么信息 web目录扫描 其中webdav很有意思&#xff0c;我们看看…