Redhat环境下构建librabbitmq RPM包时出现File not found by glob错误,如何修正Makefile中的install命令?
解决RPM构建时找不到librabbitmq.so.1*的问题
看了你的报错和配置文件,问题根源很明确:当前Makefile生成的是静态库,但RPM spec里要求的是带版本号的共享库文件,而且install步骤也没按RPM的规范安装版本化的库文件。下面一步步给你修正:
一、修改Makefile生成符合要求的共享库
1. 更新核心变量定义
先把库名改成带版本号的格式,同时定义共享库需要的软链接名称:
# 带完整版本的主共享库文件 NAME= librabbitmq.so.1.0.0 # 对应SONAME的软链接(spec里要的.so.1就是这个) SONAME= librabbitmq.so.1 # 开发用的无版本软链接(给devel包用) DEV_LINK= librabbitmq.so
2. 替换链接规则,生成共享库
原来的ar rcs是生成静态库的命令,要换成gcc编译共享库的命令,同时指定SONAME:
$(NAME):$(OBJS) # 编译生成共享库,指定SONAME参数(这是版本化共享库的关键) $(CC) $(CFLAGS) $(INCLUDES) -shared -Wl,-soname,$(SONAME) -o $(NAME) $(OBJS) $(LIBS) # 创建两个软链接,对应不同用途 ln -sf $(NAME) $(SONAME) ln -sf $(SONAME) $(DEV_LINK)
3. 修正install规则,安装所有必要文件
现在要把主库、两个软链接,以及头文件都安装到对应路径(你的spec里devel包需要头文件,之前的Makefile没处理):
prefix:=/usr/local install: $(NAME) # 确保目标目录存在 mkdir -p $(prefix)/lib64 mkdir -p $(prefix)/include # 安装主库文件(带完整版本) install -m 755 $(NAME) $(prefix)/lib64 # 安装SONAME软链接(spec里找的就是这个) ln -sf $(NAME) $(prefix)/lib64/$(SONAME) # 安装开发用软链接(给devel包) ln -sf $(SONAME) $(prefix)/lib64/$(DEV_LINK) # 安装头文件(满足devel包的文件要求) install -m 644 rabbitmq.h $(prefix)/include
4. 更新clean规则,清理所有生成的文件
把新增的共享库和软链接都加入清理列表:
clean: $(RM) *~ $(NAME) $(SONAME) $(DEV_LINK) $(RM) -r $(OBJDIR)
二、验证修改效果
先执行本地编译安装,确认文件生成正确:
make clean && make && make install
检查/usr/local/lib64目录下,应该有这三个文件:
librabbitmq.so.1.0.0(主库文件)librabbitmq.so.1(SONAME软链接)librabbitmq.so(开发用软链接)
同时/usr/local/include下要有rabbitmq.h。
三、可选:优化SPEC文件(更符合RHEL规范)
你的SPEC里定义了%define _prefix /usr/local,虽然能用,但RHEL默认的库路径是/usr/lib64,可以去掉这个定义,让RPM用默认前缀,这样更符合系统规范:
# 删掉这一行,用默认的/usr前缀 # %define _prefix /usr/local
做完这些修改后,再执行rpmbuild -ba librabbitmq.spec,应该就能顺利通过文件检查了。
内容的提问来源于stack exchange,提问作者Electrob
相关产品推荐
相关产品推荐

