使用Clang在C中复制符号

isf*_*isf 2 c duplicate-symbol

我目前正在研究我的第一个"严肃"的C项目,一个16位的虚拟机.当我将文件从一个大的源文件拆分成多个源文件时,链接器(无论是通过clang,gcc,cc还是ld调用)都会发出错误:

ld: duplicate symbol _registers in register.o and main.o for inferred 
    architecture x86_64
Run Code Online (Sandbox Code Playgroud)

registers主文件中没有任何声明.uint16_t如果有帮助,它是一个数组.我使用内置编译器(不是GNU gcc)在Mac OS 10.7.3上.有帮助吗?

pax*_*blo 12

听起来你已经在一个标题中定义了一个变量,然后包含在两个不同的源文件中.

首先,您必须了解声明某些内容(声明它存在于某处)和定义它(实际创建它)之间的区别.假设您有以下文件:

header.h:
    void printIt(void);           // a declaration.
    int xyzzy;                    // a definition.

main.c:
    #include "header.h"
    int main (void) {
        xyzzy = 42;
        printIt();
        return 0;
    }

other.c:
    #include <stdio.h>
    #include "header.h"
    void printIt (void) {         // a definition.
        printf ("%d\n", xyzzy);
    }
Run Code Online (Sandbox Code Playgroud)

编译C程序时,每个生成的目标文件都将获得一个调用的变量,xyzzy因为您通过包含标题在两者中有效地定义了它.这意味着当链接器尝试组合这两个对象时,它会遇到多个定义的问题.

解决方案是在头文件中声明事物并在C文件中定义它们,例如:

header.h:
    void printIt(void);           // a declaration.
    extern int xyzzy;             // a declaration.

main.c:
    #include "header.h"
    int xyzzy;                    // a definition.
    int main (void) {
        xyzzy = 42;
        printIt();
        return 0;
    }

other.c:
    #include <stdio.h>
    #include "header.h"
    void printIt (void) {         // a definition.
        printf ("%d\n", xyzzy);
    }
Run Code Online (Sandbox Code Playgroud)

这样,other.c知道xyzzy存在,但只main.c创建它.