You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Make并行构建问题:如何解决gSOAP源文件重复生成的异常?

解决gSOAP生成文件并行构建重复执行问题

核心解决方案:使用标记文件统一控制soapcpp2执行流程

通过引入一个标记文件(如.stamp-soap),将所有gSOAP生成的源文件与该标记文件绑定依赖,确保soapcpp2仅执行一次,同时保留其他编译步骤的并行能力。

具体Makefile.am配置步骤

  1. 定义生成文件列表
    先明确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)
    
  2. 声明自动生成的源文件
    告诉Autotools这些是构建过程中生成的文件,确保先于编译步骤执行:

    BUILT_SOURCES = service.h $(SOAP_GENERATED_FILES)
    
  3. 生成service.h的规则
    明确从wsdl文件生成头文件的依赖和命令:

    service.h: service.wsdl
    	wsdl2h -o $@ $<
    
  4. 添加标记文件规则
    创建标记文件.stamp-soap,让它依赖service.h,并在执行soapcpp2后更新标记:

    .stamp-soap: service.h
    	soapcpp2 -c++ service.h  # 根据你的需求添加其他soapcpp2参数
    	touch $@
    
  5. 绑定生成文件与标记文件的依赖
    让所有gSOAP生成的文件都依赖标记文件,确保只有标记文件更新时才触发重新生成:

    $(SOAP_GENERATED_FILES): .stamp-soap
    
  6. 配置二进制程序的源文件
    将生成的cpp文件加入你的程序源列表:

    bin_PROGRAMS = your_service_bin
    your_service_bin_SOURCES = main.cpp $(SOAP_GENERATED_CPP)
    
  7. 清理生成文件
    确保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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 20:15:36