Xcode duplicate symbol error

后端 未结 5 410
轻奢々
轻奢々 2020-12-21 08:30

I am getting \"Apple Mach-O Linker (Id) Error\":

ld: duplicate symbol _matrixIdentity in /BlahBlah/Corridor.o and /Blahblah/Drawable.o for architecture i386
         


        
相关标签:
5条回答
  • 2020-12-21 09:13

    Use -force_load for one library in Other linker flags .. that solved the prob for me once

    0 讨论(0)
  • 2020-12-21 09:14

    Two solutions to your problem:

    1. Declare only void matrixIdentity(mat4 m); in the header file and then implment the actual code in a corresponding c/m file.
    2. Make your function in the header file inline (that's the technique Apple uses)

      inline void matrixIdentity(mat4 m) { ...

    0 讨论(0)
  • 2020-12-21 09:17

    In my case, I was implementing a function in the header file itself. Adding a static inline keyword before the function fixed the error for me.

    0 讨论(0)
  • 2020-12-21 09:22

    From your description, utils.h declares and implements a variable, the implementation of which is compiled in corridor.h and Drawable.h by virtue of utils.h being included in both (indirectly through Drawable.h in the case of Corridor.h). Thus both compilation units contain an implementation for _matrixIdentity, and the linker complains.

    Move the implementation of _matrixIdentity into a new module utils.m to ensure there is only one definition of the symbol.

    0 讨论(0)
  • 2020-12-21 09:26

    C/C++/Objective-C diff with Java, C#, Ruby, Python...

    Divide files.

    header & mm

    Do not use #include (may include many times)

    Use #import... (include once)


    Utils.h

    #ifndef __utils_h__ // <<< avoid multiple #include
    #define __utils_h__ // <<< avoid multiple #include
    #import <Foundation/Foundation.h>    
    ...
    #pragma mark -
    #pragma mark Definitions
    
    typedef float mat4[16];
    
    #pragma mark -
    #pragma mark Functions
    extern void matrixIdentity(mat4 m);
    
    #endif // __utils_h__ <<< avoid multiple #include
    

    Utils.mm

    #import "Utils.h"
    
    void matrixIdentity(mat4 m)
    {
    m[0] = m[5] = m[10] = m[15] = 1.0;
    m[1] = m[2] = m[3] = m[4] = 0.0;
    m[6] = m[7] = m[8] = m[9] = 0.0;
    m[11] = m[12] = m[13] = m[14] = 0.0;
    }
    ...
    
    0 讨论(0)
提交回复
热议问题