把嘎嘎 2024-11-27 17:48 采纳率: 43.9%
浏览 27
已结题

麒麟aarch64服务器系统打包qt程序为rpm包

在麒麟aarch64服务器系统打包qt程序为rpm包,将编译好的执行程序和依赖的动态库,其他资源文件压缩放在SOURCE文件夹,编写spec文件:

Name:        Client
Version:    1.0
Release:    1
Summary:    Magic program

License:    GPL
URL:        http://ftp/magic
Source0:    Client-1.0.tar.gz

%description
The magic program

%prep
%setup -q

%build

%install
mkdir -p $RPM_BUILD_ROOT/usr/bin
cp -r %{_builddir}/Client-1.0 $RPM_BUILD_ROOT/usr/bin/

%clean
rm -rf $RPM_BUILD_ROOT

%files
%defattr (-,root,root)
/usr/bin/Client-1.0/*

成功打包rpm包进行安装,结果发现程序打不开,报错:

[root@localhost Client-1.0]# ./Client 
./Client: ./Client: no version information available (required by ./Client)
./Client: ./Client: no version information available (required by ./Client)
./Client: ./Client: no version information available (required by ./Client)
./Client: ./Client: no version information available (required by ./Client)
./Client: ./Client: no version information available (required by ./Client)
./Client: ./Client: no version information available (required by ./Client)
./Client: ./Client: no version information available (required by ./Client)
./Client: ./Client: no version information available (required by ./Client)
./Client: ./Client: no version information available (required by ./Client)
./Client: ./Client: no version information available (required by ./Client)
./Client: ./Client: no version information available (required by ./Client)
./Client: ./Client: no version information available (required by ./Client)
./Client: ./Client: no version information available (required by ./Client)
./Client: ./Client: no version information available (required by ./Client)
./Client: relocation error: ./Client: symbol  version  not defined in file  with link time reference

经过对比,发现安装后的程序和库都被改动过,这是什么情况?

  • 写回答

1条回答 默认 最新

  • JavaPub-rodert 领域专家: 后端开发技术领域 2024-11-28 09:58
    关注

    本答案参考 多次询问 ChatGPT-3.5 后选择的最佳回答,若是满意,还请采纳,谢谢

    在麒麟aarch64服务器系统上打包Qt程序为rpm包时,遇到程序无法打开并报错“no version information available”和“relocation error”的问题,通常是由于动态链接库(.so文件)的版本信息不匹配或缺失导致的。这可能是由于以下几个原因:

    1. 依赖库的版本不匹配:编译好的程序可能依赖特定版本的动态库,而这些库在目标系统上不存在或版本不匹配。确保所有依赖的动态库都包含在打包过程中,并且版本正确。

    2. 动态链接器的配置问题:Linux系统中的动态链接器(ld.so)负责在程序运行时解析动态库的引用。如果动态链接器无法找到正确的库版本,就会出现上述错误。检查/etc/ld.so.conf/etc/ld.so.conf.d/目录下的配置文件,确保包含了动态库的路径。

    3. rpm包的构建问题:在构建rpm包时,可能未正确包含所有必要的动态库。检查spec文件中的%files部分,确保所有必要的文件都被包含在rpm包中。

    4. 编译环境和运行环境不一致:如果程序在一个架构上编译而在另一个架构上运行(例如,在x86_64上编译而在aarch64上运行),可能会遇到兼容性问题。确保在目标架构上编译程序。

    5. 缺少版本脚本:Linux下的动态链接库可能需要版本脚本(version script),以确保符号版本正确。检查是否在编译时使用了正确的版本脚本。

    针对上述问题,你可以尝试以下解决方案:

    • 确保所有依赖库都包含在rpm包中:在spec文件的%files部分,确保列出了所有必要的动态库和资源文件。

    • 检查动态链接器的配置:确保/etc/ld.so.conf/etc/ld.so.conf.d/目录下的配置文件包含了动态库的路径。

    • 使用rpm的ProvidesRequires:在spec文件中使用ProvidesRequires宏来声明程序的依赖关系,确保依赖的库被正确解析。

    • 在目标架构上编译程序:确保在麒麟aarch64服务器系统上编译Qt程序,以避免架构不匹配的问题。

    • 检查版本脚本:如果使用了版本脚本,确保在编译时包含了正确的版本脚本。

    以上步骤可以帮助你解决rpm包安装后程序无法打开的问题。如果问题仍然存在,可能需要进一步检查程序的编译和链接过程,以及rpm包的构建过程。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月28日
  • 创建了问题 11月27日