2011-01-13 15 views
6

Sto lavorando su un parser che analizza la stringa json e voglio renderlo una libreria. Il problema è che quando uso ld a linkare la libreria che ho scritto, c'è un messaggio di errore:Come posso eliminare la routine "principale" del flex & bison in modo da poter inserire il lexing e il processo di analisi in una libreria?

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 

come posso risolvere questo problema ..? Grazie.

+0

CPPFLAGS = -Dmain = foo –

risposta

5

Poiché né il flex né il bisonte creano la funzione principale per te, deve essere il tuo main() nel codice che sta intralciando la libreria. Fondamentalmente, non mettere main() in una libreria.

Tuttavia, è giusto notare che sia la libreria Flex (-lfl, /usr/lib/libfl.*) e la libreria Yacc (-ly, /usr/lib/liby.*) in effetti contengono un programma rudimentale main(). Se si utilizza una o entrambe le librerie, è necessario assicurarsi che il proprio file oggetto con main() sia collegato prima della scansione delle librerie.

+0

sì è il '-lfl' grazie mille ~~~~ – mapcan

6

utilizzando gcc -o charcount charcount.o -lfl anziché gcc -o charcount -lfl charcount.o potrebbe essere di aiuto.

È strano che l'ordine del file oggetto e della libreria condivisa abbia un significato cruciale qui, ma la reversione funziona davvero.

+0

Non è strano, è spiegato in [questa risposta] (https://stackoverflow.com/a/4682741/1983495). –