Ошибки при компиляции Neko VM OS X

Я пытаюсь скомпилировать виртуальную машину Neko в 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 ответа

Решение

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

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

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

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

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

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

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

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

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

В make-файле?

Другие вопросы по тегам