Make并行构建问题:如何解决gSOAP源文件重复生成的异常?
解决gSOAP生成文件并行构建重复执行问题
核心解决方案:使用标记文件统一控制soapcpp2执行流程
通过引入一个标记文件(如.stamp-soap),将所有gSOAP生成的源文件与该标记文件绑定依赖,确保soapcpp2仅执行一次,同时保留其他编译步骤的并行能力。
具体Makefile.am配置步骤
定义生成文件列表
先明确soapcpp2会生成的所有文件(根据你的实际生成结果调整):# gSOAP生成的头文件和源文件 SOAP_GENERATED_H = soapH.h soapStub.h SOAP_GENERATED_CPP = soapC.cpp soapClient.cpp soapServer.cpp SOAP_GENERATED_FILES = $(SOAP_GENERATED_H) $(SOAP_GENERATED_CPP)声明自动生成的源文件
告诉Autotools这些是构建过程中生成的文件,确保先于编译步骤执行:BUILT_SOURCES = service.h $(SOAP_GENERATED_FILES)生成service.h的规则
明确从wsdl文件生成头文件的依赖和命令:service.h: service.wsdl wsdl2h -o $@ $<添加标记文件规则
创建标记文件.stamp-soap,让它依赖service.h,并在执行soapcpp2后更新标记:.stamp-soap: service.h soapcpp2 -c++ service.h # 根据你的需求添加其他soapcpp2参数 touch $@绑定生成文件与标记文件的依赖
让所有gSOAP生成的文件都依赖标记文件,确保只有标记文件更新时才触发重新生成:$(SOAP_GENERATED_FILES): .stamp-soap配置二进制程序的源文件
将生成的cpp文件加入你的程序源列表:bin_PROGRAMS = your_service_bin your_service_bin_SOURCES = main.cpp $(SOAP_GENERATED_CPP)清理生成文件
确保make clean能删除所有生成的临时文件:CLEANFILES = service.h $(SOAP_GENERATED_FILES) .stamp-soap
原理说明
- 标记文件
.stamp-soap作为唯一依赖service.h的目标,并行构建时只有一个Make进程会执行soapcpp2命令,其他进程会等待该标记文件生成完成。 - 所有gSOAP生成的源文件都依赖标记文件,而非直接依赖
service.h,避免了多个编译进程同时触发soapcpp2执行的问题。 - 保留了除生成gSOAP文件外所有编译步骤的并行能力,不会像
.NOTPARALLEL那样完全禁用多核构建。
注意事项
- 确保
soapcpp2的参数符合你的项目需求(比如是否需要生成服务器/客户端代码、命名空间处理等)。 - 如果你的Make版本低于4.3,
.WAIT语法不支持,标记文件方法是兼容性更好的选择。
内容的提问来源于stack exchange,提问作者nobody
相关产品推荐
相关产品推荐

