Background:

Background: 遇到一个打包可执行程序和链接库生成rpm 包的需求,查遍了很多网站的资料,现在整理下解决方案。

前期参考的是这篇帖子: https://codeantenna.com/a/jUEqRgoEsZ

CSDN 很多帖子都是抄的rpm 官方提供的教程:https://www.thegeekstuff.com/2015/02/rpm-build-package-example/

这个帖子介绍了rpmbuild 的所有操作,包括把源码放到rpmbuild 创建的文件夹中,通过配置spec完成从源码=》编译=》打包=》安装的全流程,很详细但是太复杂了。我遇到的场景是,已经构建了CMAKELIST, 可以通过写好的脚本一键编译生成可执行程序和需要的动态连接库,我们这里只需要打包一下即可。

Processing:

该打包过程只是记录了一下将二进制放入rpm中的过程和注意事项,不涉及预编译、编译和安装等繁琐的过程。

1 、安装依赖

此次打包是SUSE 系统,需要提前安装 rpmbuild 工具。

zypper in -y rpm-build rpmdevtools

2、创建安装目录

通过rpm 构建默认的文件夹,rpm 默认创建文件夹的路径都是在~/ 目录,如果你把rpmbuild 目录移动到其他地方,进去build ,会显示找不到文件,可以修改rpmbuild 的路劲信息,但是本教程就在~/ 目录下打包。

rpmdev-setuptree

# ls -lF /home/rpmbuild/
drwxr-xr-x. 2 home home 4096 Feb 4 12:21 BUILD/
drwxr-xr-x. 2 home home 4096 Feb 4 12:21 BUILDROOT/
drwxr-xr-x. 2 home home 4096 Feb 4 12:21 RPMS/
drwxr-xr-x. 2 home home 4096 Feb 4 12:21 SOURCES/
drwxr-xr-x. 2 home home 4096 Feb 4 12:21 SPECS/
drwxr-xr-x. 2 home home 4096 Feb 4 12:21 SRPMS/

3、编写spec文件

在SPECS目录中,创建并编写一个**.spec文件,名字无所谓,格式如下,这个文件很关键,这是告诉rpmbuild 如何打包,其他不相关的我直接删了,只留最需要的

%files 是告诉rpm 打包方法,即你最终想如何把你的程序安装到linux 系统里面。

Summary: test package.
Name: Test
Version: 1.0
Release: 200
License: GPL
Group: test
AutoReqProv: no %description
test process rpm.
%files
/usr/bin/test
/usr/test

我现在有两个资源,一个test程序需要在安装之后放到/usr/bin目录,之前cmake 会生成test 和libtest.so 这两个得在一块才能运行,所以我把这两个文件都放在/usr/test/ 中,然后 在/usr/bin/中链接一个可执行程序 ../test/test .

4、放置资源

放入资源的时候需要根据编写的spec文件来放置,在BUILDROOT目录要先创建一个目录Test-1.0-200.x86_64,该目录是根据spec文件中配置拼接而成:Name-Version-Release.arch。

然后在Test-1.0-200.x86_64中创建目录usr/bin,usr/test/,然后将test、libtest.so 放入usr/test/ ,然后cd usr/bin, ln -s ../test/test , 这样就把可执行程序链接到了usr/bin,这样后期安装也是这么按照到linux 下的/usr

  其实打包方式很灵活的,需要结合当前项目的需求灵活考虑

5、打包

进入SPECS目录,执行 rpmbuild -bb **.spec 命令,就可以在RPMS目录中生成相应的rpm包了。

利用rpmbuild 打包可执行文件和链接库生成rpm 包的更多相关文章

  1. rpmbuild 源码打包clickhouse,附带打好的rpm包下载地址

    一.下载 clickhouse 源码包 git clone --recurse-submodules -b v1.1.54385-stable https://github.com/yandex/Cl ...

  2. ceph 生成rpm包

    概述 从ceph的源码build出rpm包: #git clone --recursive https://github.com/ceph/ceph.git #./instal-dep.sh 以上两点 ...

  3. shell如何生成rpm包仓库列表文件的对比结果

    基本步骤: 1.切换至仓库目录RPM_LIST_DIR1和RPM_LIST_DIR2 2.ls列出仓库的rpm包文件并分别重定向至输出文件rpm_list_file1和rpm_list_file2 3 ...

  4. rpmbuild打包

    安装: yum  install -y rpm-build 目录介绍: 默认目录在  /root/rpmbuild BUILD :你要打包的文件将会在这里编译(编译rpm包的临时目录) BUILDRO ...

  5. linux下静态链接库和动态链接库

    关于链接库的知识,网上太多资料了,但是并不代表我很熟悉.今天遇到了 一个问题,就是由于静态链接库和ubuntu系统不兼容导致的,虽然花了点时间才搞定 但是,其中暴露的问题也不少. 没有区分好静态链接库 ...

  6. rpm包的rpmbuild spec文件详解

    http://machael.blog.51cto.com/829462/213477 上一篇日志写到,为什么要制作rpm包,以及如何使用.src.rpm文件生成rpm包.最后部分还看到.src.rp ...

  7. 利用GCC编译器生成动态链接库和静态链接库

    转载请标明:http://www.cnblogs.com/winifred-tang94/ 1.编译过程 gcc –fPIC –c xxx.c 其中-fPIC是通知gcc编译器产生位置独立的目标代码. ...

  8. GO 使用 动态链接库(共享链接库)进行编译 生成动态链接可执行文件

    我们使用 go help buildmode 可以看到 go 可以以多种方式进行构建,默认使用静态链接库. ➜ src go help buildmode The 'go build' and 'go ...

  9. GO 使用静态链接库编译 生成可执行文件 使用第三方 .a 文件,无源码构造

    go build 和 go install 都需要使用源码来进行编译.但是有时候我们只有.a或者.so文件.并不能获取到第三方库的源码,这时我们需要静态链接库编译的技巧: 上图是实验前的文件分布. 使 ...

随机推荐

  1. Python|range函数用法完全解读

    写在前面的一些过场话: 迭代器是 23 种设计模式中最常用的一种(之一),在 Python 中随处可见它的身影,我们经常用到它,但是却不一定意识到它的存在.在关于迭代器的系列文章中(链接见文末),我至 ...

  2. ByDesign各版本区别

    by zyi

  3. 温湿度监测系统设计:基于 STM32 的温湿度变送器的设计与实现

    前言:这个是2018年上半年完成的,这里只贴出硬件设计部分,软件设计部分可以看上位机说明书. 设计总说明 随着科学技术的不断发展,高集成度.高精度.高可靠性的一体化温湿度变送器开始 得到广泛的应用.同 ...

  4. 字符输出流_Writer类&FileWriter类介绍和字符输出流的基本使用_写出单个字符到文件

    java.io.Writer:字符输出流,是所有字符输出流的最顶层的父类,是一个抽象类 共性的成员方法: - void write(int c) 写入单个字符 - void write(char[] ...

  5. (一)java基础篇---第一个程序

    先认识java的基础知识 1.变量命名规则 :1)变量名由数字字母下划线组成,2)不能使用java的关键字,比如public这种,3)遵循小驼峰命名法 2.数据类型 2.1基本数据类型有8种 其中分为 ...

  6. CSS 导航栏底线向两边延伸动画

    利用元素向左移动的同时,宽度变长,实现两边延伸效果. react代码: <ul className="tab"> { moduleList.map((item: any ...

  7. 20220724-Java的封装相关

    目录 含义 常见使用方法 个人理解 含义 封装 (encapsulation) 指隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别. 常见使用方法 class Pers ...

  8. PHP goto

    if (true){ echo "run if\n"; goto fly; } else{ fly: echo "run else"; }

  9. 从RabbitMQ平滑迁移到RocketMQ技术实战

    作者:vivo 互联网中间件团队- Liu Runyun 大量业务使用消息中间件进行系统间的解耦.异步化.削峰填谷设计实现.公司内部前期基于RabbitMQ实现了一套高可用的消息中间件平台.随着业务的 ...

  10. Nginx 配置静态资源防盗链

    # 什么是静态资源盗链: # 你服务器上的一张图片,127.0.0.1/images/a.png # 别人的html页面可以直接通过<img src="127.0.0.1/images ...