2011-06-14 57 views
1

无论何时我将全局变量id theScene放在.mm文件中,我都会收到错误Command/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/llvm-g++-4.2 failed with exit code 1。它适用于.m文件,但是稍后我需要.mm来执行box2d。另外,我觉得在这里真正的错误所在:在目标C++中声明全局变量时出错?

ld: duplicate symbol _theScene in /Users/sgupta100/Documents/TheifGame/build/TheifGame.build/Release-iphonesimulator/TheifGame.build/Objects-normal/i386/HelloWorldScene.o and /Users/sgupta100/Documents/TheifGame/build/TheifGame.build/Release-iphonesimulator/TheifGame.build/Objects-normal/i386/TheifGameAppDelegate.o

我不知道这到底是什么意思所以有人解释一下吗?

回答

0

这个变量是否在标头中声明?如果是这样,声明是否使用extern关键字?如果没有,编译器将为每个编译单元(.m,.mm,.c,.cpp等)发送一个符号,以表示头部。

如果标题不是问题,则“HelloWorldScene”和“TheifGameAppDelegate”编译单元中的某些内容正在生成一个theScene符号。变量既可以在两者中定义,也可以是其他内容(如函数)恰好具有相同的名称。

没有发布你的代码或其他细节,我再也不能告诉你这个问题了。

更新:在多个文件中使用全局变量的正确方法是变量声明为extern在头部((Objective-)C++编译和变量也需要从访问时,有条件地使用extern "C"( Objective-C)然后在.m,.mm,.c或.cpp文件中将其精确地定义一次而不是extern并且可能带有一个初始化程序头文件当然必须包含在所有需要访问变量

+0

是的,我不得不在.mm文件中声明变量 – dgTheUser 2011-06-20 02:31:47

+0

正确的方法是声明变量为'extern'在头文件中(有条件地使用'extern“C”'编译时使用(Objective-)C++并且该变量也需要可以从(Objective-)C访问。然后在.m,.mm,.c或.cpp文件中只准确定义一次*不带'extern'并可能带有一个初始化程序。我怀疑它在.mm文件中声明它时“起作用”的原因是它实际上不再是同一个变量,即如果你在一个文件中改变它,另一个文件将不会看到改变。查看C和C++的链接。 – pmdj 2011-06-20 12:46:16

+0

您不能基于类型覆盖全局变量,只能使用方法和函数名称。因此,在这种情况下不需要'extern'C“',因为它仅告诉编译器不应用覆盖所需的名称修改。在声明全局变量时使用简单的'extern'关键字,并将其保留在实际定义全局的位置。 – uliwitness 2013-01-23 09:24:19