2011-01-13 21 views
6

Tôi đang làm việc trên một trình phân tích cú pháp phân tích cú pháp chuỗi json và tôi muốn biến nó thành một thư viện. Vấn đề là khi tôi sử dụng ld để liên kết các thư viện tôi đã viết, có một thông báo lỗi:Làm thế nào tôi có thể loại bỏ thói quen 'chính' của flex & bison để tôi có thể đặt quá trình lexing và phân tích cú pháp vào một thư viện?

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 

thế nào tôi có thể sửa lỗi này ..? cảm ơn.

+0

CPPFLAGS = -Dmain = foo –

Trả lời

5

Vì cả flex lẫn bison đều không tạo ra chức năng chính cho bạn, nó phải là của riêng bạn main() trong mã đang được sử dụng trong thư viện. Về cơ bản, không đặt main() vào thư viện.

Tuy nhiên, nó chỉ là công bằng cần lưu ý rằng cả hai thư viện Flex (-lfl, /usr/lib/libfl.*) và thư viện Yacc (-ly, /usr/lib/liby.*) làm trên thực tế chứa một chương trình thô sơ main(). Nếu bạn sử dụng một trong hai hoặc cả hai thư viện, thì bạn phải đảm bảo tệp đối tượng của riêng bạn với main() được liên kết trước khi các thư viện được quét.

+0

yeah đó là '-lfl' cảm ơn rất nhiều ~~~~ – mapcan

6

sử dụng gcc -o charcount charcount.o -lfl thay vì gcc -o charcount -lfl charcount.o có thể trợ giúp.

Thật kỳ lạ khi thứ tự của tệp đối tượng và thư viện được chia sẻ có ý nghĩa quan trọng ở đây, nhưng sự đảo ngược thực sự hiệu quả.

+0

Nó không lạ, nó được giải thích trong [câu trả lời này] (https://stackoverflow.com/a/4682741/1983495). –