尝试在 antlr4 中生成解析器时遇到问题

问题描述

我正在尝试用 C++ 编译我自己的 ANTLR4 解析器

#include "nibble.h"

using namespace antlr4;
using namespace nibble;

int main(int argc,const char* argv[]){

    const std::string file_name = argv[1];
    ANTLRInputStream input(file_name);

    return 0;
}

但是当我通过输入 g++ nibblec.cpp -o nibblec -I /usr/local/include/antlr4-runtime 编译它时我得到

/usr/bin/ld: /tmp/ccqG8KT4.o: warning: relocation against '_ZTVN6antlr416ANTLRInputStreamE' in read-only section '.text._ZN6antlr416ANTLRInputStreamD2Ev[_ZN6antlr416ANTLRInputStreamD5Ev]'
/usr/bin/ld: /tmp/ccqG8KT4.o: in function 'main':
nibblec.cpp:(.text+0x64): undefined reference to 'antlr4::ANTLRInputStream::ANTLRInputStream(std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char> > const&)'
/usr/bin/ld: /tmp/ccqG8KT4.o: in function 'antlr4::ANTLRInputStream::~ANTLRInputStream()':
nibblec.cpp:(.text._ZN6antlr416ANTLRInputStreamD2Ev[_ZN6antlr416ANTLRInputStreamD5Ev]+0xf): undefined reference to `vtable for antlr4::ANTLRInputStream'
/usr/bin/ld: nibblec.cpp:(.text._ZN6antlr416ANTLRInputStreamD2Ev[_ZN6antlr416ANTLRInputStreamD5Ev]+0x42): undefined reference to 'antlr4::CharStream::~CharStream()'
/usr/bin/ld: warning: creating DT_TEXTREL in a PIE
collect2: error: ld returned 1 exit status

什么是ld?为什么我会收到所有这些警告?我在使用 ANTLR4 时做错了什么吗?

编辑:我使用的是 ANTLR 4.9.1

解决方法

您没有链接到 ANTLR。您可能需要将 -lantlr 添加到您的编译标志(尽管确切的拼写可能不同,您可能需要指定一个包含 ANTLR 的库目录)。