2

我正在尝试使用 GCC 4.01 在 Mac OS X (10.5.7) 上编译Neko VM,但我完全卡住了,因为它在编译时停止说:

vm/threads.c:202: error: conflicting types for 'neko_thread_register'
vm/neko_vm.h:37: error: previous declaration of 'neko_thread_register' was here

我试过用谷歌搜索,有人说这是因为缺少“原型”,有人说这是因为标题包含被多次完成,我真的找不到任何这些。

threads.c:202中受影响的行如下所示:

EXTERN bool neko_thread_register( bool t ) {

neko_vm.h:37中受影响的行如下所示:

EXTERN bool neko_thread_register( bool t );

除了其中一个是另一个的实现之外,我看不出它们有任何区别。

我正在使用的编译器命令是:

cc -Wall -O3 -v -fPIC -fomit-frame-pointer -I vm -D_GNU_SOURCE -arch i386 -L/usr/local/lib -L/opt/local/lib -I/opt/local/include  -o vm/threads.o -c vm/threads.c

我会很感激一些关于我可以在这里做什么的想法,我真的不知道从这里去哪里。

可以在此处找到我正在尝试编译的 Neko 代码的镜像。

谢谢!

4

3 回答 3

1

首先,确保将其编译为 C,而不是 C++。

其次,没有看到代码,几乎不可能说出问题所在。但是阅读错误消息通常会有所帮助(甚至在您搜索它们之前):

显然neko_thread_register被声明了两次,一次在threads.c:202中,一次在neko_vm.h:37中,并且这两个声明具有不同的(冲突的)类型。所以看看这两个声明。如果您看不到它们的问题,请向我们展示一些代码。

至少,看到这两行代码是必要的。最有可能的类型是 typedef 或宏或类似的东西,然后我们还需要查看它们的定义位置。

没有看到代码,我们所能做的就是重复编译器错误。"neko_thread_register在指定的行中有两个相互冲突的定义。"

于 2009-05-16T16:50:29.750 回答
1

您是否尝试过单独编译该文件并输出预处理版本?可能是在头文件和实现文件之间的某个地方修改了作用域或链接宏——“bool”类型也可能是这样,它通常是由系统头文件定义的宏。

根据此处的 GCC 4.2 文档,您应该需要在上面的编译行中添加 -E 标志,并且您应该更改-o vm/threads.o-o vm/threads.i创建具有正确扩展名的文件(.i 本质上表示“预处理文件”)。

于 2009-05-16T23:43:12.767 回答
0

您是否取消注释此行:

# For OSX
#
# MACOSX = 1   <-- this one

在生成文件中?

于 2009-05-16T17:57:09.573 回答