Compiler construction GNUflex库libfl提供了什么?

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

我可以用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:
0000000000000000 T yywrap

正如您所见,它提供了函数
main
yywrap
,因此您不需要定义它们。

那么为什么链接器中没有重复的
main
错误定义呢
T main
看起来不像弱符号。如果不需要
main
符号,则
libmain.o
不会链接到可执行文件中,并且不会出现多定义错误。奇怪。如果
libmain.o
与程序中已有的内容发生冲突,则可以从库中删除它,这是在哪里/如何指定的?啊哈!如果我使用
-Wl,--whole-archive-lfl-Wl,--no-whole-archive
,那么我会得到多个定义错误。这似乎是链接器如何对待可执行文件的行为。仅删除提供已满足的符号(或仅提供不需要的符号)的对象。如果我们将归档分解为
.o
文件,并在命令行中单独显示它们(或多或少类似于
--整个归档
行为),则不会出现这种情况。是的。如果在linker命令中明确列出了一个对象文件,那么它将无条件地链接到可执行文件中。如果对象文件是静态库的一部分,则仅当它为某些未定义的符号提供定义时,才会链接该文件。