2014-10-15 2 views
0

Я использую библиотеку C antrr3c. Я установил библиотеку с помощью: Sudo APT-получить установку libantlr3c-DEVНеопределенная ошибка ссылки в C

#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: неопределенная ссылка to `antlr3StringStreamNew '

Я не понимаю, как разрешить эту ошибку, поскольку antlr3StringStreamNew действительно объявлен в antlr3defs.h. Хотя я не могу найти его определения.

Если это связано с несовместимостью с версией 3.4 antlr3c (как я установил версию 3.2). Если это действительно так, есть ли альтернативная функция в версии antlr3c версии 3.4, с помощью которой я могу достичь такой же функциональности.

+1

Как вы строите свою программу? – user58697

+7

Я скептически отношусь к тому, что вы получаете эту ошибку, когда * запускаете * программу; он больше похож на ошибку компоновщика. Обновите свой вопрос, чтобы показать нам, как вы создали программу. Вероятно, вам просто нужно добавить параметр '-l ...' при создании, поэтому компоновщик знает, где найти библиотеку, которая определяет 'antlr3StringStreamNew'. Возможно, вам также понадобится сделать что-то, что позволит вам вызвать функцию в C-библиотеке из кода на C++; у 'antlr3defs.h' есть требуемый' extern 'C "'? –

+0

@Keith Фактически эта функция изменилась с 3.2 до 3.4, как видно из ответа пользователя на https://theantlrguy.atlassian.net/wiki/display/ANTLR3/Five+minute+introduction+to+ANTLR+3 –

ответ

1

Keith is right - используемый вами компоновщик ожидает разные символы из-за смены имени C++. Таким образом, хотя ваш код будет компилироваться, на этапе ссылки он не с этой ошибкой.

Если вы окружите свой заголовок включают, как это так, линкер должен найти символы:

extern "C" { 
    #include "antlr3defs.h" 
} 

Результатом является то, что ваш код компилируется со ссылками на имена функций C-типа, позволяя линкер, чтобы соответствовать их с соответствующими символами в объектных файлах библиотеки antlr3.

Смежные вопросы