Compiler construction GNUflex库libfl提供了什么?
我可以用flex和bison生成的文件编译一个程序Compiler construction GNUflex库libfl提供了什么?,compiler-construction,compilation,gnu,bison,flex-lexer,Compiler Construction,Compilation,Gnu,Bison,Flex Lexer,我可以用flex和bison生成的文件编译一个程序 cc lex.yy.c程序.tab.c-o输出 还有 cc lex.yy.c program.tab.c-lfl-o输出 它们运行平稳,没有任何问题 那么libfl在这里提供了什么呢?我试图搜索文档,但找不到详细的解释 $ nm /usr/lib/x86_64-linux-gnu/libfl.a libmain.o: 0000000000000000 T main U yylex libyywrap.o: 00
cc lex.yy.c程序.tab.c-o输出
还有
cc lex.yy.c program.tab.c-lfl-o输出
它们运行平稳,没有任何问题
那么libfl
在这里提供了什么呢?我试图搜索文档,但找不到详细的解释
$ nm /usr/lib/x86_64-linux-gnu/libfl.a
libmain.o:
0000000000000000 T main
U yylex
libyywrap.o:
0000000000000000 T yywrap
正如您所见,它提供了函数
main
和yywrap
,因此您不需要定义它们。那么为什么链接器中没有重复的main
错误定义呢T main
看起来不像弱符号。如果不需要main
符号,则libmain.o
不会链接到可执行文件中,并且不会出现多定义错误。奇怪。如果libmain.o
与程序中已有的内容发生冲突,则可以从库中删除它,这是在哪里/如何指定的?啊哈!如果我使用-Wl,--whole-archive-lfl-Wl,--no-whole-archive
,那么我会得到多个定义错误。这似乎是链接器如何对待可执行文件的行为。仅删除提供已满足的符号(或仅提供不需要的符号)的对象。如果我们将归档分解为.o
文件,并在命令行中单独显示它们(或多或少类似于--整个归档
行为),则不会出现这种情况。是的。如果在linker命令中明确列出了一个对象文件,那么它将无条件地链接到可执行文件中。如果对象文件是静态库的一部分,则仅当它为某些未定义的符号提供定义时,才会链接该文件。