2011-01-13 7 views
6

Pracuję nad parserem, który analizuje ciąg jsonów i chcę go uczynić biblioteką. Problemem jest to, że gdy używam ld połączyć bibliotekę pisałem jest komunikat o błędzie:W jaki sposób mogę wyeliminować "główną" procedurę flex i bison, aby móc umieścić proces leksykowania i parsowania w bibliotece?

main.o: In function `main': 
main.c:(.text+0x0): multiple definition of `main' 
json-parser.o:/build/buildd/flex-2.5.35/libmain.c:29: first defined here 

jak mogę to naprawić ..? dzięki.

+0

CPPFLAGS = -Dmain = foo –

Odpowiedz

5

Ponieważ ani flex ani bison nie tworzą głównej funkcji dla ciebie, musi to być twój własny main() w kodzie, który wchodzi w drogę do biblioteki. Zasadniczo nie umieszczaj main() w bibliotece.

Jednak jest to tylko sprawiedliwe, by pamiętać, że zarówno biblioteki Flex (-lfl, /usr/lib/libfl.*) i biblioteka Yacc (-ly, /usr/lib/liby.*) w rzeczywistości zawierają szczątkowe main() program. Jeśli używasz jednej lub obu tych bibliotek, musisz upewnić się, że Twój własny plik obiektowy o numerze main() jest połączony przed skanowaniem bibliotek.

+0

tak jest to '-lfl' dziękuję ~~~~ – mapcan

6

użycie gcc -o charcount charcount.o -lfl zamiast gcc -o charcount -lfl charcount.o może być pomocne.

To dziwne, że kolejność plików obiektowych i biblioteki współdzielonej ma tu kluczowe znaczenie, ale powrót działa naprawdę.

+0

To nie jest dziwne, to wyjaśnione w [ta odpowiedź] (https://stackoverflow.com/a/4682741/1983495). –

Powiązane problemy