c - 使用 Clang 在 C 中复制符号

标签 c duplicate-symbol

我目前正在做我的第一个“严肃的”C 项目,一个 16 位的 vm。当我将文件从一个大的源文件拆分成多个源文件时,链接器(无论是通过 clang、gcc、cc 还是 ld 调用)都会抛出错误:

ld: duplicate symbol _registers in register.o and main.o for inferred 
    architecture x86_64

没有registers的声明主文件中的任何位置。这是一个 uint16_t阵列,如果有帮助。我在 Mac OS 10.7.3 上使用内置编译器(不是 GNU gcc)。有什么帮助吗?

最佳答案

听起来您已经在 header 中定义了一个变量,然后将其包含在两个不同的源文件中。

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

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);
    }

当你编译 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);
    }

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

关于c - 使用 Clang 在 C 中复制符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10944784/

相关文章:

c - '->' 的类型参数无效

c++ - 关于链接器命令失败,退出代码为 1

iphone - 如何修复此重复符号错误?

c - C中的重复符号错误

c - 用于扩展除法/乘法的 gcc intrinsic

c - 从终端读取数字字符串并保存在 c 中的数组中

c - 释放数组的第一个元素

c - realpath() 不解析符号链接(symbolic link)?

xcode - 如何找到重复符号的位置

ios5 - 重复的符号_OBJC_CLASS _ $ _ LoginController