【问题标题】:Error: symbol 'xxx' is multiply defined错误:符号“xxx”被多重定义
【发布时间】:2015-08-11 23:30:32
【问题描述】:

我在代码中添加了多个金属着色器,现在我得到:

Error: symbol '<shader name>' is multiply defined
Command /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/usr/bin/metallib failed with exit code 1

我没有在任何地方包含 .metal 文件(XCode 负责编译本身),我无法将 inlinestatic 添加到函数中,所以出了什么问题?

【问题讨论】:

    标签: ios linker metal


    【解决方案1】:

    在头文件中定义函数也存在问题。我以为我可以内联它们,但似乎我只能声明它们。

    例如,我有这个头文件,

    // ShaderMath.h
    #pragma once
    using namespace metal;
    float4 conjugate(const float4 q);
    
    float4 conjugate(const float4 q) {
      return float4( -q.xyz, q.w );
    }
    

    如果我在多个金属文件中包含此标头,则会收到“多重定义”错误。但是,如果我将定义移动到 .metal 文件,那么它就可以工作。头文件只是,

    // ShaderMath.h
    #pragma once
    using namespace metal;
    float4 conjugate(const float4 q);
    

    还有金属文件,

    // ShaderMath.metal
    #include <metal_stdlib>
    #include "ShaderMath.h"
    using namespace metal;
    float4 conjugate(const float4 q) {
      return float4( -q.xyz, q.w );
    }
    

    我希望这可以帮助其他遇到同样问题的人。

    【讨论】:

    • 对我来说同样的情况,这是 Apple 的丑陋设计。
    【解决方案2】:

    显然,如果一个着色器函数与另一个文件中的另一个函数具有完全相同相同的签名,则它被视为重复。我更改了用于输出的结构的名称并将其链接。

    【讨论】:

      【解决方案3】:

      对我来说,这发生在我重命名金属文件时。出于某种原因,有一些伪影存在,我开始在构建时看到重复符号错误。不确定这是错误还是什么,但我可以修复它的唯一方法是重命名函数。

      【讨论】:

      • 您应该也可以通过使用 Cmd+Shift+K 清理项目来解决此问题。
      猜你喜欢
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多