Ошибки при компиляции Neko VM OS X - PullRequest
2 голосов
/ 16 мая 2009

Я пытаюсь скомпилировать Neko VM на Mac OS X (10.5.7), используя GCC 4.01, и я полностью застрял, потому что он останавливается при компиляции, говоря:

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

Я пытался найти это в Google, и некоторые говорят, что это из-за отсутствия «прототипа», а некоторые говорят, что это из-за того, что заголовок включался несколько раз, и я не могу найти ни одного из них.

Уязвимая строка в 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, который я пытаюсь скомпилировать, можно найти здесь .

Спасибо!

Ответы [ 3 ]

1 голос
/ 17 мая 2009

Вы пытались скомпилировать этот файл один и вывести предварительно обработанную версию? Может случиться так, что макросы области видимости или связывания изменяются где-то между файлом заголовка и файлом реализации - то же самое можно сказать и о типе 'bool', который обычно является макросом, определяемым системным заголовком.

В соответствии с документами GCC 4.2, приведенными здесь, вам необходимо добавить флаг -E в строку компиляции выше, и вам следует изменить -o vm/threads.o на -o vm/threads.i, чтобы создать файл с правильным расширением (.i по сути означает «предварительно обработанный файл».

1 голос
/ 16 мая 2009

Во-первых, убедитесь, что вы компилируете это как C, а не C ++.

Во-вторых, не видя код, почти невозможно сказать, в чем проблема. Но чтение сообщений об ошибках часто полезно (даже до того, как вы их погуглите):

Очевидно, neko_thread_register объявляется дважды, один раз в threads.c: 202 и один раз в neko_vm.h: 37, и эти два объявления имеют разные (конфликтующие) типы. Итак, посмотрите на две декларации. Если вы не видите проблемы с ними, покажите нам код.

По крайней мере, было бы необходимо увидеть эти две строки кода. Скорее всего, типы - это typedefs или макросы или что-то подобное, и тогда нам нужно будет увидеть, где они определены.

Не видя код, все, что мы можем сделать, это повторить ошибку компилятора. «neko_thread_register имеет два конфликтующих определения в указанных строках.»

0 голосов
/ 16 мая 2009

Вы раскомментировали эту строку:

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

В make-файле?

...