rpm打包入门

2023-11-10

RPM 做什么

我们先来看看在您运行 rpmbuild -ba filename.spec 时,RPM 都 做些什么:

  1. 读取并解析 filename.spec 文件
  2. 运行 %prep 部分来将源代码解包到一个临时目录,并应用所有的补丁程序。
    %setup –q
    %patch,%patch0,%patch1
  3. 运行 %build 部分来编译代码。
  4. 运行 %install 部分将代码安装到构建机器的目录中。
  5. 读取 %files 部 分的文件列表,收集文件并创建二进制和源 RPM 文件。
  6. 运行 %clean 部 分来除去临时构建目录。

$BuildRoot$RPM_BUILD_ROOT 一 般是相同值,在%install时,一般将东西安装到这个临时根下,所以一般在install前rm -rf $RPM_BUILD_ROOT,%clean 时rm -rf $RPM_BUILD_ROOT。%files中 声明了真正的路径,rpm会到构建根下寻找其对 应的文件。%clean 是一切都正常的情况下在 RPM 构建结束时运行的脚本,这样临时文件就不会一直 保留。

构建rpm包 时不会在%file所列路径中添加任何东西,此时所有东西都是安装在%RPM_BUILD_ROOT所在路径底下,只有在安装rpm包 时会在对应路径下添加。用来查一些内 置变量的值,如

rpm –showrc

_sourcedir
RPM 在哪里查找源文件(tar 文件,等)

_srcrpmdir
RPM 在哪里放入新的源 RPM 文件

_rpmdir
RPM 将 把新的二进制 RPM 文件放在哪里(在特定于体系结构的子目录中)

_topdir
BUILD、SOURCE、 SPEC、SRPM、RPM这5个目录所在的目录。

在/usr/lib/rpm/macros中 差一些宏的缺省值,如 %_sourcedir 、 %_specdir 、 %_srcrpmdir 、 %_builddir 和 %_rpmdir。

注意: prep 后的操作都是在 tmp 的目录中进行的。

一、RPM 打包前的准备工作

1. 要打包套件,必须先安装 rpm-build 套件

$sudo yum install rpm-build

2. 建立打包套件的环境
不建议用 root 来打包套件,所以请改用一般的使用者身分来打包套件,首先要安装 fedora-rpmdevtools 这个套件.

接著执行 fedora-buildrpmtree 来建立打包的环境

$sudo yum install fedora-rpmdevtools

执行完后,在 Home 目录底下就产生 rpmbuild 的目录
在 rpmbuild 目录底下又有 BUILD RPMS SOURCES SPECS SRPMS 五个子目录,如果是 RedHat 是没有这个包的,可以自己来建这些目录.

$fedora-buildrpmtree

$mkdir -p ~/rpmbuild/{BUILD,RPMS,S{OURCE,PEC,RPM}S}

这些目录的作用如下

BUILD        编译时所用的暂存目录
RPMS        放置打包好的套件
SOURCES   放置套件的原始码及修补档等等
SPECS    放置 .spec 档
SRPMS 放置 Source RPMS (.src.rpm)

-bp 只作准备 (解压与打补丁)
-bc 准备并编译
-bi 编译并安装
-bl 检验文件是否齐全
-ba 编译后做成*.rpm和src.rpm
-bb 编译后做成*.rpm
-bs 只做成*.src.rpm
-tc -ti -ta -tb -ts 的功能类似,只是所需参数由spec文件变成tar包。


3.建立 ~/.rpmmacros 档案
编辑 ~/.rpmmacros,主要是设定 %packager 及 %vendor 等等:

%_topdir 这个选项是配置 RPM 在构建时使用新的目录结构,而不是默认的目录结构.也可以自己使用如下命令来指定.

%_topdir %(echo $HOME)/rpmbuild%_smp_mflags -j3%__arch_install_post /usr/lib/rpm/check-rpaths /usr/lib/rpm/check-buildroot%packager Fu Kai

echo "%_topdir $HOME/rpmbuild" > ~/.rpmmacros
如果有 GPG Key 可以加上类似底下几行,到时候要 GPG Sign 时会用到:

%_signature gpg%_gpg_path ~/.gnupg%_gpg_name Fu Kai

二、建立 RPM 的 spec 档案


我以打包 pcmanfm-0.3.0-beta3.tar.gz 为例
假设这个套件没有人打包过,因此必须自行建立 pcmanfm.spec 档案
先进到 ~/rpmbuild/SPECS 目录底下:

$cd ~/rpmbuild/SPECS

1. 利用 fedora-newrpmspec 工具程式来产生一个 spec 档的样本,然后再慢慢来修改

fedora-newrpmspec pcmanfm

执行完后,就会产生 pcmanfm.spec,spec 档的命名规则为 %{name}.spec,这个的 Encoding 必须为 UTF-8。

2. 编辑 pcmanfm.spec
2.1.Version、Release 及 Summary

Version Tag 及 Release Tag 的命名规则,请参考:

Version: 0.3.0Release: 0.1.beta3%{?dist}Summary: PCMan File Manager

http://fedoraproject.org/wiki/Packaging/NamingGuidelines

Version Tag 要是数字才行
pcmanfm-0.3.0-beta3 算是 Pre-release packages
(Version 中包含 “alpha”, “beta”, “rc”, “cvs”)
我们不能直接用在 Version 中,beta3 的部份要改放到 Release 中

格式: 0.%{X}.%{alphatag}
0 不变
%{X} 从 1 开始递增
%{alphatag} 来自於 Version Tag 中的字串

Release Tag for Pre-Release Packages:

所以 pcmanfm-0.3.0-beta3 的 Release Tag 就是 0.1.beta3
至於后面的 Dist Tag (%{?dist}) 则是给 mock build 时用的
Dist Tag 请参考: http://fedoraproject.org/wiki/Packaging/DistTag

2.2.Group、License、URL、 Source、Patch 及 BuildRoot

Group 部份请参考:
/usr/share/doc/rpm-*/GROUPS 或是 http://fedoraproject.org/wiki/RPMGroups

Group: Applications/SystemLicense: GPLURL: http://pcmanfm.sourceforge.netSource0: http://jaist.dl.sourceforge.net/sourceforge/pcmanfm/pcmanfm-0.3.0-beta3.tar.gzBuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

Source 部份,最好是包含整个网址,而不要只有档名而已
若有好几个 Source 则用 Source0 Source1 Source2 … 依此类推
若有 Patch 档就需要用到 (例: Patch0: pcmanfm-0.3.0-beta3-Makefile.patch)
若有好几个 Pacth 则用 Patch0 Patch1 Patch2 … 依此类推

必要时需要自己制作 patch 档案,例:

cd ~/rpmbuild/BUILD/pcmanfm-0.3.0-beta3cp Makefile Makefile.orig

然后修改 Makefile

cd ~/rpmbuild/BUILDgendiff pcmanfm-0.3.0-beta3 .Makefile < ../SOURCES/pcmanfm-0.3.0-beta3-Makefile.patch

2.3.BuildRequires 及 Requires

BuildRequires 及 Requires 的部份就要看原作者是否有提到需要哪些套件
不然,就得从 mock build 时的 build.log 中
慢慢去找出所需要的 BuildRequires 及 Requires

BuildRequires: automake >= 1.9, gtk2-devel >= 2.6, gamin-develRequires: gtk2 >= 2.6, gamin

2.4.%description

%descriptionPCMan File ManagerAn extremly fast and lightweight file manager which features tabbed browsingand user-friendly interfaceFeatures:Extremly fast and lightweightCan be started in one second on normal machineTabbed browsing (Similar to Firefox)Drag & Drop supportFiles can be dragged among tabsLoad large directories in reasonable timeFile association support (Default application)Basic thumbnail supportBookmarks supportHandles non-UTF-8 encoded filenames correctlyProvide icon view and detailed list viewStandard compliant (Follows FreeDesktop.org)Clean and user-friendly interface (GTK+ 2)

%description 要注意的是,每一行最长不要超过 79 个字元

2.5.%changelog

%changelog 部份,就是日期、打包者的姓名及 E-mail 等等
最后面则是要包含这次的 %{version}-%{release}
若有使用 Epoch Tag 则是 %{Epoch}:%{version}-%{release}

%changelog* Fri Aug 18 2006 Fu Kai

2.6.%prep

%setup macro 会把 source code tarball 解开并自动进到 %{name}-%{version} 的目录中
因为我们把 Version Tag 0.3.0-beta3 的 beta3 拆到 Release Tag 去
Version Tag 变成 0.3.0,所以 %setup 在 rpmbuild 时会出问题
rpmbuild 会解开 pcmanfm-0.3.0-beta3.tar.gz 并试著进到 pcmanfm-0.3.0 (%{name}-%{version}) 的目录中
但实际上应该是要进到 pcmanfm-0.3.0-beta3 的目录才对
因此,我们必须加上 -n pcmanfm-0.3.0-beta3 来解决这个问题
若有 Source2 Source5 等等的 tarball 同时也要解开时,可以使用 -a 参数来指定 (例: %setup -q -a 2 -a 5)
若有 Patch 档则同样在这里做处理 (例: %patch1 -p1 -b .bak)
其他一些在正式 build (make) 前要做的特殊处理,都可以在这里做
(例: find . -name \*.h -o -name \*.c | xargs chmod ugo-x)

%prep%setup -q -n pcmanfm-0.3.0-beta3

2.7.%build

若有需要加 configure 的参数,可以加在 %configure 后面
(例: %configure –prefix=%{_prefix})
若还有其他的编译指令需要执行时,都可以加在这里

%build%configuremake %{?_smp_mflags}

2.8.%install

%installrm -rf $RPM_BUILD_ROOTmake install DESTDIR=$RPM_BUILD_ROOT%find_lang %{name}desktop-file-install \&ndash;delete-original \&ndash;vendor fedora \&ndash;dir ${RPM_BUILD_ROOT}/%{_datadir}/applications \&ndash;add-category X-Fedora \${RPM_BUILD_ROOT}/%{_datadir}/applications/pcmanfm.desktop

若还有其他相关的安装指令都可以加在这里
至於 locale mo 档的部份,则是要改用 %find_lang macro 来处理
另外,关於 desktop 档的部份,要在 %install 中使用 desktop-file-install 来处理
然后在 %files 中加入一行:

%{_datadir}/applications/fedora-pcmanfm.desktop

BuildRequires 的部份也要加入 desktop-file-utils:

BuildRequires: automake >= 1.9, gtk2-devel >= 2.6, gamin-devel, desktop-file-utils

另外还要加入:

Requires(post): desktop-file-utils
Requires(postun): desktop-file-utils

%post 及 %postun 的部份也要做处理
Desktop files 请参考: http://fedoraproject.org/wiki/Packaging/Guidelines#desktop

2.9.%clean

%clean
rm -rf $RPM_BUILD_ROOT

2.10.%files

%files -f %{name}.lang
%defattr(-,root,root,-)
%doc AUTHORS COPYING ChangeLog INSTALL NEWS README TODO
%{_datadir}/applications/fedora-pcmanfm.desktop

%files 后面的 -f %{name}.lang 则是跟 %find_lang macro 搭配
用来处理 locale mo 档
%doc 部份,则是放 AUTHORS COPYING ChangeLog INSTALL NEWS README TODO 等文件
至少要放版权的部份 (如 License: GPL 则 COPYING 的内容就是放 GPL 版权的内容)
若不知道还会安装哪些档案也没关系,之后可以利用 rpmbuild -bi 的 log 来查询

2.11.%post

%post
update-desktop-database %{_datadir}/applications >/dev/null 2>&1 || :

用来处理套件安装完成后要执行的指令
例如 update-desktop-database 那行就是在处理 Desktop files 部份

2.12.%postun

%postun
update-desktop-database %{_datadir}/applications >/dev/null 2>&1 || :

用来处理套件移除后要执行的指令
例如 update-desktop-database 那行就是在处理 Desktop files 部份

2.13.%pre
用来处理套件安装前要执行的指令
在本例中没有用到

2.14.%preun
用来处理套件移除前要执行的指令
在本例中没有用到

三、测试打包
除了 %files 的部份还没完全处理完外,其他部份大致上都没问题了

1.rpmbuild -bc
rpmbuild -bc 会从一开始一直做到 %build 为止
用来检查到 %build 为止是否还有问题
若有发现任何错误,如 command not found 等等
就要去 check required package 然后加到 Requires/BuildRequires 中

rpmbuild -bc pcmanfm.spec

像我一执行时就出现错误:

checking for PACKAGE&hellip; configure: error: Package requirements (gtk+-2.0 >= 2.6.0 gthread-2.0 libstartup-notification-1.0) were not met:No package &lsquo;libstartup-notification-1.0&prime; found

查了一下,所需要的套件是 startup-notification-devel

$ locate libstartup-notification-1.0/usr/lib/pkgconfig/libstartup-notification-1.0.pc$ rpm -qf /usr/lib/pkgconfig/libstartup-notification-1.0.pcstartup-notification-devel-0.8-3.2.1

因此,修改 BuildRequires 如下:

BuildRequires: automake >= 1.9, gtk2-devel >= 2.6, gamin-devel, desktop-file-utils, gettext, startup-notification-devel

加进了 startup-notification-devel
而多加了 gettext 则是给 mock build 用的
因为在 mock build 时会去 check 是否有 gettext,有才会去执行 %find_lang macro

2.rpmbuild -bi
rpmbuild -bi 会从一开始一直做到 %install 为止

rpmbuild -bi pcmanfm.spec

例如我执行完的结果,看到以下的警告讯息:

warning: Installed (but unpackaged) file(s) found:/usr/bin/pcmanfm/usr/share/applications/pcmanfm.desktop/usr/share/locale/ca/LC_MESSAGES/pcmanfm.mo/usr/share/locale/de/LC_MESSAGES/pcmanfm.mo/usr/share/locale/es/LC_MESSAGES/pcmanfm.mo/usr/share/locale/fr/LC_MESSAGES/pcmanfm.mo/usr/share/locale/hu/LC_MESSAGES/pcmanfm.mo/usr/share/locale/it/LC_MESSAGES/pcmanfm.mo/usr/share/locale/pl/LC_MESSAGES/pcmanfm.mo/usr/share/locale/pt_BR/LC_MESSAGES/pcmanfm.mo/usr/share/locale/ru/LC_MESSAGES/pcmanfm.mo/usr/share/locale/sv_SE/LC_MESSAGES/pcmanfm.mo/usr/share/locale/zh_CN/LC_MESSAGES/pcmanfm.mo/usr/share/locale/zh_TW/LC_MESSAGES/pcmanfm.mo

因此,可以得知,%files 中还少了 /usr/bin/pcmanfm
至於 locale 的 mo 档部份,可以不用管,改交给 %find_lang macro 去处理了
而 /usr/share/applications/pcmanfm.desktop 则改由 desktop-file-install 处理
因此,修改后的 %files 部份如下:

%files -f %{name}.lang%defattr(-,root,root,-)%doc AUTHORS COPYING ChangeLog INSTALL NEWS README TODO%{_bindir}/pcmanfm%{_datadir}/applications/fedora-pcmanfm.desktop

相关的 macros 可以在 http://fedoraproject.org/wiki/Extras/RPMMacros 查询到
常见的如:

%{_sysconfdir} /etc%{_initrddir} %{_sysconfdir}/rc.d/init.d%{_prefix} /usr%{_exec_prefix} %{_prefix}%{_bindir} %{_exec_prefix}/bin%{_lib} lib%{_libdir} %{_exec_prefix}/%{_lib}%{_libexecdir} %{_exec_prefix}/libexec%{_sbindir} %{_exec_prefix}/sbin%{_sharedstatedir} %{_prefix}/com%{_datadir} %{_prefix}/share%{_includedir} %{_prefix}/include%{_oldincludedir} /usr/include%{_var} /var%{_tmppath} %{_var}/tmp

请尽量改用 macros 来取代 /etc /usr/bin /usr/lib 的写法

3.rpmbuild -bs、rpmbuild -bb and rpmbuild -ba
若 rpmbuild -bi 都没错误,接下来就可以开始打包套件了

3.1.用 rpmbuild -bs 来产生 SRPMS

rpmbuild -bs pcmanfm.spec

3.2.用 rpmbuild -bb 来产生 RPMS

rpmbuild -bb pcmanfm.spec

3.3.用 rpmbuild -ba 来同时产生 SRPMS 及 RPMS

rpmbuild -ba pcmanfm.spec

四、使用 rpmlint 来检查 SRPMS RPMS

rpmlint -i ~/rpmbuild/SRPMS/pcmanfm-0.3.0-0.1.beta3.src.rpmrpmlint -i ~/rpmbuild/RPMS/i386/pcmanfm-*.rpm

rpmlint 的错误讯息请参考:

http://fedoraproject.org/wiki/ParagNemade/CommonRpmlintErrors

http://fedoraproject.org/wiki/Packaging/CommonRpmlintIssues

五、使用 mock 来 chroot build
mock 是一个 Chroot Build Tools
关於 mock 的安装、设定及使用请参考: http://blog.candyz.org/20060818/1307

mock -r fedora-5-i386-core.cfg ~/rpmbuild/SRPMS/pcmanfm-0.3.0-0.1.beta3.src.rpm

六、RPM 建包其他进阶部份


1.devel subpackage
所有的可执行档及 *.so.* 要放在 main package
而所有的 headers, static libraries, libtool archives, *.so files, autotools,
and pkgconfig files 则要放在 -devel subpackage.

若套件有包含一些不重要的 examples 时,可以在 %install 最后的地方删除掉
把 examples 改放到 -devel 的 %doc 中

请参考:
http://fedoraproject.org/wiki/Docs/Drafts/BuildingPackagesGuide

的范例

2.不需要加到 BuildRequires 中的 Exceptions

bash
bzip2
coreutils
cpio
diffutils
fedora-release (and/or redhat-release)
gcc
gcc-c++
gzip
make
patch
perl
redhat-rpm-config
rpm-build
sed
tar
unzip
which

详细清单请参考: http://fedoraproject.org/wiki/Extras/FullExceptionList

3.Documentation
若有相关的说明文件,可以独立成 -doc subpackage
并以 Documentation 当作 Group Tag

4.Configuration files
设定档请使用 %config(noreplace) 来代替 %config
只有当设定档有变时,才改用 %config 来覆盖掉旧的

5.Macros
详细的 Macros 请参考: http://fedoraproject.org/wiki/Extras/RPMMacros

6.不要使用 %makeinstall macro
直接用:

make DESTDIR=$RPM_BUILD_ROOT install

7.Fedora RPM Development Tools
fedora-rpmdevtools,请参考: http://fedoraproject.org/wiki/fedora-rpmdevtools

8.RPM scriptlet recipes
关於 %pre %post %preun %postun 的用法及注意事项,请参考:

http://fedoraproject.org/wiki/Packaging/ScriptletSnippets

七、RPM 建包时的 GPG Sign。

rpmbuild &ndash;sign

在执行 rpmbuild 时加上 –sign 的参数

rpm &ndash;addsign

若在 rpmbuild 时没有使用 –sign 参数,也可以事后再用 rpm –addsign 来 Sign 套件

八、RPM 建包参考文件

http://fedoraproject.org/wiki/Docs/Drafts/BuildingPackagesGuide

http://koti.welho.com/vskytta/packagers-handbook/packagers-handbook.html

http://fedoraproject.org/wiki/Packaging/Guidelines

http://fedoraproject.org/wiki/ParagNemade/PackagingNotes

http://www.rpm.org/max-rpm/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

rpm打包入门 的相关文章

  • Tomcat Intellij Idea:远程部署

    RackSpace 云服务器 Ubuntu 12 04 Intellij Idea 11 1 2 Windows 8 Tomcat 7 0 26 JDK 6 在 Intellij Idea 上 当我尝试在远程 Tomcat 7 服务器上运行
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu
  • 为什么 Linux 没有 DirectX API?

    在考虑现代显卡的 Windows 系统上 DirectX API 的驱动程序端实现时 我想知道为什么此实现在非 Windows 系统 尤其是 Linux 上不可用 由于明显缺乏此功能 我只能假设有一个我无视的充分理由 但在我的原始理解中 我
  • 调用 printf 系统子例程在汇编代码中输出整数错误[重复]

    这个问题在这里已经有答案了 来回 在windows7控制台窗口中运行gcc s2 asm 然后生成一个exe文件 运行a exe 然后崩溃 为什么 s2 asm 代码由以下源代码生成 int m m 1 iprint m s2 asm请参考
  • docker 非 root 绑定安装权限,WITH --userns-remap

    all 尝试让绑定安装权限正常工作 我的目标是在容器中绑定安装卷 以便 a 容器不以 root 用户身份运行入口点 二 docker daemon 配置了 userns remap 这样容器 主机上没有 root c 我可以绑定挂载和读 写
  • 通过 Visual Studio 2017 使用远程调试时 Linux 控制台输出在哪里?

    我的Visual Studio 2017 VS2017 成功连接Linux系统 代码如下 include
  • Linux 上的静态 Qt5 构建:部署时如何处理字体?

    我使用这些配置选项创建了 Qt 5 2 0 库的静态版本 Ubuntu 12 04 开源 确认许可 force pkg config 发布 静止的 前缀 home juzzlin qt5 无icu opengl桌面 无油嘴滑舌 辅助功能 n
  • GMail 421 4.7.0 稍后重试,关闭连接

    我试图找出为什么它无法使用 GMail 从我的服务器发送邮件 为此 我使用 SwiftMailer 但我可以将问题包含在以下独立代码中
  • C 语言的符号表

    我目前正在开发一种执行模式匹配的静态分析工具 我在用Flex https github com westes flex生成词法分析器 我编写了代码来管理符号表 我不太有经验C 所以我决定将符号表实现为线性链表 include
  • 添加文件时运行 shell 命令

    我的 Linux 机器上有一个名为 images 的文件夹 该文件夹连接到一个网站 该网站的管理员可以向该网站添加图片 但是 当添加图片时 我想要一个命令来运行调整目录中所有图片的大小 简而言之 我想知道当新文件添加到特定位置时如何使服务器
  • CMake 链接 glfw3 lib 错误

    我正在使用 CLion 并且正在使用 glfw3 库编写一个程序 http www glfw org docs latest http www glfw org docs latest 我安装并正确执行了库中的所有操作 我有 a 和 h 文
  • 在 Mono 上运行 .Net MVC5 应用程序

    我正在 Windows 上的 Visual Studio 2013 中开发 Net 4 5 1 MVC5 应用程序 现在我想知道 是否可以在Linux Ubuntu 12 04 上运行这个应用程序 可以使用OWIN吗 Owin 可以自托管运
  • Bash - 在与当前终端分开的另一个终端中启动命令的新实例

    我有一个简单的 bash 脚本 test sh 设置如下 bin bash args if args 0 check capture then watch n 1 ls lag home user capture0 watch n 1 ls
  • 静态方法的 Java 内存模型

    我来自操作系统和 C 语言背景 在代码编译时 世界很简单 需要处理和理解堆栈 堆文本部分等 当我开始学习 Java 时 我确实了解 JVM 和垃圾收集器 我对静态方法感到很有趣 根据我的理解 类的所有实例都会在堆中创建 然后被清理 但是 对
  • Mac OS X 上的 /proc/self/cmdline / GetCommandLine 等效项是什么?

    如何在不使用 argc argv 的情况下访问 Mac OS X 上的命令行 在 Linux 上 我会简单地阅读 proc self cmdline or use GetCommandLine在 Windows 上 但我找不到 Mac OS
  • 错误:“rjags”的包或命名空间加载失败

    在终端的 conda 环境之一中 我能够成功安装包 rjags 但是 当我在该环境中运行 R 并运行库 rjags 时 出现以下错误 加载所需的包 coda 错误 rjags 的包或命名空间加载失败 rjags 的 loadNamespac
  • Linux 为一组进程保留一个处理器(动态)

    有没有办法将处理器排除在正常调度之外 也就是说 使用sched setaffinity我可以指示线程应该在哪个处理器上运行 但我正在寻找相反的情况 也就是说 我想从正常调度中排除给定的处理器 以便只有已明确调度的进程才能在那里运行 我还知道
  • 如何在 Mac OSX Mavericks 中正确运行字符串工具?

    如何在 Mac OSX Mavericks 中正确运行字符串工具 我尝试按照我在网上找到的示例来运行它 strings a UserParser class 但我收到此错误 错误 Applications Xcode app Content
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 无法显示 Laravel 欢迎页面

    我的服务器位于 DigitalOcean 云上 我正在使用 Ubuntu 和 Apache Web 服务器 我的家用计算机运行的是 Windows 7 我使用 putty 作为终端 遵循所有指示https laracasts com ser

随机推荐

  • 三合一浴霸必须一直接通取暖开关才能控制照明和风扇的解决方法

    刚新租了一个二室房子 入住后发现这样一个奇怪的问题 要想只让三合一 照明 取暖 通风 浴霸只照明或者只通风 必须得把取暖打开才行 并且取暖必须一直打开 否则一旦断开 照明和取暖也用不了了 头一次遇见这样的问题 首先怀疑是否是浴霸就是这么设计
  • Kotlin IO操作

    前段时间学习了一点内容 写了一篇Groovy开发工具包 我当时就在想Kotlin怎么没有好用的文件操作API呢 后来我发现我太傻了 Kotlin这么好用的语言怎么可能没有自己的文件API呢 Kotlin的IO操作都在kotlin io包下
  • 数据结构习题解析与实验指导-严蔚敏数据结构-第三章:栈和队列(刷题记录)

    目录 第三章 栈和队列 刷题记录 P 48 49 第一题 2022年4月15日 星期五 晚上19 20 19 35 第三章 栈和队列 刷题记录 P 48 49 第一题 2022年4月15日 星期五 晚上19 20 19 35 算法思想 两栈
  • allegro 丝印 对齐_Cadence Allegro 17.2高级功能- Label Tune 批量字符对齐功能

    Allegro的全称是Cadence Allegro PCB Designer 是Cadence公司推出的一个完整的高性能印制电路板设计套件 通过顶尖的技术 它为创建和编辑复杂 多层 高速 高密度的印制电路板设计提供了一个交互式 约束驱动的
  • UE中UPROPERTY部分说明符

    在UE的C 编程中 通常使用UPROPERTY EditAnywhere 宏将属性公开给UE编辑器 使得可以在UE编辑器中对这些属性进行修改 避免了多次编译的繁琐 这个宏也有一些说明符 不同的含义 EditAnywhere 括号中必须有这个
  • oracle 11g在安装过程中出现监听程序未启动或数据库服务未注册到该监听程序

    在使用Database configuration Assistant创建数据库时 在创建到85 的时候报错 错误提示内容如下 错误分析 经过查看警告中给出的日志文件 F develop oracle data app Administra
  • PHP 7Ghost实现反向代理功能,不需要Nginx,支持替换

    虽然Nginx可以方便 简单地实现网站反向代理 但是也存在一定的不方便 此处省略1000字 7ghost是一款基于PHP的网站反向代理 反向绑定域名 程序 能够快速高效的反向代理所指定的网站 并拥有丰富的内容替换 请求头设置 7Ghost这
  • MSP430F5529——中断理解

    认识低功耗模式 MSP430的中断 需要两个部分 一部分是打开中断 另外一部分是编写中断服务函数 打开中断 BIS SR与 bis SR register 首先我们得知道 bis SR register和 BIS SR是一个玩意 查看宏定义
  • RedisTemplate中opsForValue的使用

    Spring 封装了 RedisTemplate 对象来进行对redis的各种操作 它支持所有的 redis 原生的 api 查阅点资料下面总结看下Redis中opsForValue 方法的使用介绍 1 set K key V value
  • PyQt5 资源加载总结

    一 概述 在Qt Designer中要使用图片资源有三种方法 通过图像文件指定 通过资源文件指定 通过theme主题方式指定 对应的设置界面在需要指定图像的属性栏如QLabel 的pixmap 属性通过点击属性设置栏的倒三角按钮触发 如下图
  • springboot部署成jar包后的启动,停止,重启脚本

    注 不知道出处在哪里 不过测试后可以使用 文章目录 脚本内容 给脚本权限 使用方式 脚本内容 bin bash 这里可替换为你自己的执行程序 其他代码无需更改 APP NAME home application processes proc
  • vivo 悟空活动中台 - H5 活动加载优化

    本文首发于 vivo互联网技术 微信公众号 链接 https mp weixin qq com s 6gtVR0nVNcZvREjwftZgzA 作者 悟空中台研发团队 悟空活动中台 系列往期精彩文章 揭秘 vivo 如何打造千万级 DAU
  • 面试之CurrentHashMap的底层原理

    首先回答HashMap的底层原理 HashMap是数组 链表组成 数字组是HashMap的主体 链表则是主要为了解决哈希冲突而存在的 要将key 存储到 put HashMap中 key类型实现必须计算hashcode方法 默认这个方法是对
  • 查找html_nodes,JavaScript DOM 3 - 查找特定位置上的节点

    首先把 接下来用于测试的html先贴出来 item list book 1 book 2 cat 1 cat 2 在前面的文章 JavaScript DOM 1 node Node HTMLElement之间到底是什么关系 中 已经解释过的
  • 聊聊STM32单片机定时器的编码器接口与几种编码器模式

    STM32 单片机的定时器模块可以用于实现编码器接口 用于读取和解码旋转编码器的信号 编码器是一种常见的旋转输入设备 通常用于读取转盘 旋钮等控制元件的旋转方向和步进数 在 STM32 单片机中 定时器模块可以用于接收和解码编码器的信号 以
  • 一席长文让你看懂LED灯需要做哪些检测

    一 LED灯具测试参考依据 GB 7000 1 2015灯具 第1部分 一般要求与试验 整体式LED路灯的测量方法 外壳防护等级 IP代码 GB T 4208 2017 二 测试时的检验项目 1 力学测试 a 拉力试验 b 压力试验 c 插
  • 如何利用SQL注入进行爆库

    SQL注入能做什么 在 SQL注入基础 一文介绍了SQL注入的基本原理和实验方法 那接下来就要问一下 SQL注入到底能什么 估计很多朋友会这样认为 利用SQL注入最多只能获取当前表中的所有记录 但无法获取其它表的内容 事实果真的如此 正像小
  • Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.resha

    1 问题 使用sklearn建立模型之后进行预测时出现 Reshape your data either using array reshape 1 1 if your data has a single feature or array
  • Qt 之 emit、signals、slot的使用

    本文福利 莬费领取Qt开发学习资料包 技术视频 内容包括 C 语言基础 Qt编程入门 QT信号与槽机制 QT界面开发 图像绘制 QT网络 QT数据库编程 QT项目实战 QSS OpenCV Quick模块 面试题等等 见下面 文章底部点击莬
  • rpm打包入门

    RPM 做什么 我们先来看看在您运行 rpmbuild ba filename spec 时 RPM 都 做些什么 读取并解析 filename spec 文件 运行 prep 部分来将源代码解包到一个临时目录 并应用所有的补丁程序 set