我正在使用C库antlr3c。我使用以下命令安装了库:sudo apt-get install libantlr3c-dev
#include "antlr3defs.h"
..
string DBparser::sparqlParser(const string& _sparql, SPARQLquery& _sparql_query)
{
pANTLR3_INPUT_STREAM input;
pSparqlLexer lex;
pANTLR3_COMMON_TOKEN_STREAM tokens;
pSparqlParser parser;
input = antlr3StringStreamNew((ANTLR3_UINT8 *)(_sparql.c_str()),ANTLR3_ENC_UTF8,_sparql.length(),(ANTLR3_UINT8 *)"QueryString");
}
当我运行包含上述片段的程序时,我收到错误: NetBeansProjects / gstore / Parser / DBparser.cpp:25:未定义引用`antlr3StringStreamNew'
我没有得到如何解决这个错误,因为antlr3StringStreamNew确实是在antlr3defs.h中声明的。虽然我无法找到它的定义。
如果这与antlr3c的3.4版本不兼容(因为我已经安装了3.2版本)。如果情况确实如此,那么在antlr3c版本3.4中是否有任何替代功能,通过它我可以实现相同的功能。
答案 0 :(得分:1)
Keith是对的 - 由于C ++名称错误,您正在使用的链接器需要不同的符号。因此,虽然您的代码将进行编译,但在链接阶段它会因该错误而失败。
如果您将标题包含在内,则链接器应找到符号:
extern "C" {
#include "antlr3defs.h"
}
结果是你的代码编译了对C风格函数名的引用,允许链接器将它们与antlr3库的目标文件中的相应符号相匹配。