我目前正在做我的第一个“严肃的”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/