C++ 如何在本机节点插件中成功链接Flex、Bison和Node.js?

C++ 如何在本机节点插件中成功链接Flex、Bison和Node.js?,c++,c,node.js,bison,flex-lexer,C++,C,Node.js,Bison,Flex Lexer,我正在尝试使用Flex/Bison编写一个原生Node.js解析器。插件有三个部分:lexer、解析器和node/v8接口。lexer和解析器在一开始工作得很好(我使用g++编译lexer/解析器,并包括必要的lexer函数,如:)。当我将node/v8部分添加到混合中时,我最终得到了lexer代码中定义的函数的缺少符号错误 以下是文件结构的概述: File A: Lexer file, automatically generated by flex from the lexer rules I

我正在尝试使用Flex/Bison编写一个原生Node.js解析器。插件有三个部分:lexer、解析器和node/v8接口。lexer和解析器在一开始工作得很好(我使用g++编译lexer/解析器,并包括必要的lexer函数,如:)。当我将node/v8部分添加到混合中时,我最终得到了lexer代码中定义的函数的缺少符号错误

以下是文件结构的概述:

File A: Lexer file, automatically generated by flex from the lexer rules I wrote.

File B: The parser file, includes the extern "C" { [lexer functions] } and 
        a function called parse(std::string). parse() calls some yy_functions, 
        which are defined in the lexer, and returns a c++ data structure 
        representing the parsed data.

File C: This is the node/v8 part. There is a header file with the prototype for 
        B's parse() function. When JS calls a certain function, the data is 
        converted to a c++ string and passed to the parse() function in File B.
当我运行一个简单的测试来解析JS字符串时,我得到一个错误

node:symbol lookup error:/home/monty/projects/flex\u bison/GetObj\u Request\u Parser/build/default/GetObjParser.node:undefined symbol:yy\u scan\u string

注意:我正在使用node waf来构建这个插件,并且我已经将flex和bison生成的文件从[FILE].c重命名为[FILE].cc,以便构建脚本能够获取它们

如果您想查看一些代码,可以在这里找到它们:(查看src/buildstuffs目录)

谢谢


<> > > [j],使用两个不同的编译器,并用节点WAF构建脚本(My Stand)来解决问题,一个可以使用Flex ++和BySe++生成C++ C++。这可能意味着lex.yy.c文件中函数的链接是错误的。我认为您需要找到另一种方法,让节点构建系统识别您的.c文件,并使用c而不是c++正确地构建它们。

摆脱
geto.y
文件顶部的
extern“c”
。flex函数没有使用C-linkage导出。

您的git树中是否缺少
Makefile
?我认为这不应该被标记为带有Adobe flex;而是gnu flex。我重新标记了它。@sarnold,生成文件是根目录中的wscript@flextras,谢谢你的支持retag@www,遗憾的是,
[flex]
标记被放到了更新得多的项目中,当然应该是
[adobeflex]
:)但是感谢重新标记,重叠的问题让我无穷无尽。不幸的是,这没有起作用。谢谢你的建议!我用一个很长的时间来处理节点WAF构建脚本,最后通过编译不同编译器的C和C++源文件来实现它。谢谢
File A = src/buildstuffs/lex.yy.c[c]
File B = src/buildstuffs/geto.tab.c[c]
File C = src/buildstuffs/GetObjParser.cc
Test = test.js