Flex / Bison: множественное определение «указанной функции» - PullRequest
0 голосов
/ 12 ноября 2018

Поскольку мой код слишком длинный, я подумал, что было бы легче опубликовать ссылку на github, если кто-то захочет мне помочь и ему понадобится код: https://github.com/Pigums/Cminus-Compiler

В cygwin я запускаю этикоманды:

bison -d step3.y
flex step3.fl
gcc step3.tab.c lex.yy.c -lfl -o step3

Затем появляются следующие ошибки:

/tmp/ccdKHQL3.o:step3.tab.c:(.text+0x0): multiple definition of `CreateTemp'
/tmp/ccfXBuoP.o:lex.yy.c:(.text+0x0): first defined here
/tmp/ccdKHQL3.o:step3.tab.c:(.text+0x4a): multiple definition of `Insert'
/tmp/ccfXBuoP.o:lex.yy.c:(.text+0x4a): first defined here
/tmp/ccdKHQL3.o:step3.tab.c:(.text+0x140): multiple definition of `PrintSym'
/tmp/ccfXBuoP.o:lex.yy.c:(.text+0x140): first defined here
/tmp/ccdKHQL3.o:step3.tab.c:(.text+0x19f): multiple definition of `Display'
/tmp/ccfXBuoP.o:lex.yy.c:(.text+0x19f): first defined here
/tmp/ccdKHQL3.o:step3.tab.c:(.text+0x1e6): multiple definition of `Search'
/tmp/ccfXBuoP.o:lex.yy.c:(.text+0x1e6): first defined here
/tmp/ccdKHQL3.o:step3.tab.c:(.text+0x266): multiple definition of `Delete'
/tmp/ccfXBuoP.o:lex.yy.c:(.text+0x266): first defined here
/tmp/ccdKHQL3.o:step3.tab.c:(.text+0x2fd): multiple definition of `ASTCreateNode'
/tmp/ccfXBuoP.o:lex.yy.c:(.text+0x2fd): first defined here
/tmp/ccdKHQL3.o:step3.tab.c:(.text+0x3c0): multiple definition of `ASTattachleft'
/tmp/ccfXBuoP.o:lex.yy.c:(.text+0x3c0): first defined here
/tmp/ccdKHQL3.o:step3.tab.c:(.text+0x3f6): multiple definition of `PT'
/tmp/ccfXBuoP.o:lex.yy.c:(.text+0x3f6): first defined here
/tmp/ccdKHQL3.o:step3.tab.c:(.text+0x427): multiple definition of `ASTprint'
/tmp/ccfXBuoP.o:lex.yy.c:(.text+0x427): first defined here
/tmp/ccdKHQL3.o:step3.tab.c:(.text+0xa83): multiple definition of `compareFormals'
/tmp/ccfXBuoP.o:lex.yy.c:(.text+0xa83): first defined here
/tmp/ccdKHQL3.o:step3.tab.c:(.bss+0x0): multiple definition of `mem'
/tmp/ccfXBuoP.o:lex.yy.c:(.bss+0x14): first defined here
collect2: error: ld returned 1 exit status

Не уверен, что я делаю неправильно, попытался найти ошибку, но я не думаю, что ответы яесть те, кого я ищу.В чем здесь проблема?

Ответы [ 3 ]

0 голосов
/ 11 июля 2019

Это может быть поздно, но я должен держать это здесь. У меня было то же «Множественное определение проблемы функции», хотя я использовал правильные операторы включения. Я не совсем понимаю, почему это происходит, но получается, что я получал множественные ошибки определения только для глобальных функций (которые не находятся внутри какого-либо класса) в моих заголовочных файлах. У меня была куча служебных методов, и не очень много значило быть функцией-членом класса.

Итак, я получаю сообщение об ошибке «Несколько определений» для этих функций:

My Problem

Итак, мое решение было:

Solution

По сути, их обертывание с классом решило проблему, и теперь она работает нормально.

0 голосов
/ 16 июля 2019

Я попробовал оба решения. Они работали нормально. Но все же у меня были другие ошибки «множественного определения» в других моих заголовочных файлах, где я использовал класс. Эти файлы имели объявления методов внутри класса, но определения методов вне класса с использованием Разрешение области действия (::) .

Итак, я попробовал это

удалите все объявления методов и запишите все определения методов внутри класса

И это сработало!

0 голосов
/ 12 ноября 2018
#include "symtable.c"
#include "ast.c"

Вот твоя проблема. Включив эти два файла C в раздел requires в step3.y, их содержимое заканчивается как lex.yy.c и step3.tab.c, так что все определяется дважды.

Вместо этого вы должны включить заголовочные файлы, а не файлы C, а затем скомпилировать и связать ast.c и symbtable.c, передав их в gcc:

gcc step3.tab.c lex.yy.c ast.c symtable.c -o step3

(Вы также можете использовать Makefile для компиляции каждого файла отдельно, а затем связать их вместе, так что вам нужно только перекомпилировать измененные файлы, но это совсем другое дело)

Обратите внимание, что это не характерно для сгибания или бизона. Вы не должны когда-либо #include C-файлы, если вы точно не знаете, что это означает, и у вас есть очень веская причина.

...