Я использую библиотеку 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. Хотя я не могу найти его определения.
Если это связано с несовместимостью с версией 3.4 antlr3c (как я установил версию 3.2). Если это действительно так, есть ли альтернативная функция в версии antlr3c версии 3.4, с помощью которой я могу достичь такой же функциональности.
Кит прав - используемый вами компоновщик ожидает разных символов из-за C++. Таким образом, хотя ваш код будет компилироваться, на этапе ссылки он не с этой ошибкой.
Если вы окружаете свой заголовок, включите его так, что компоновщик должен найти символы:
extern "C" {
#include "antlr3defs.h"
}
В результате ваш код компилируется со ссылками на имена функций C-стиля, позволяя компоновщику сопоставлять их с соответствующими символами в объектных файлах библиотеки antlr3.
-l...
при сборке, чтобы компоновщик знал, где найти библиотеку, которая определяетantlr3StringStreamNew
. Вам также может понадобиться сделать что-то, чтобы учесть тот факт, что вы вызываете функцию в библиотеке C из кода C ++;antlr3defs.h
имеет требуемыйextern "C"
?