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
创建它.